निष्पादित स्क्रिप्ट का पथ निर्धारित करें


255

मेरे पास एक स्क्रिप्ट है foo.R है जिसमें एक और स्क्रिप्ट शामिल है other.R, जो उसी निर्देशिका में है:

#!/usr/bin/env Rscript
message("Hello")
source("other.R")

लेकिन मैं चाहता हूँ Rकि लगता है other.Rकोई बात नहीं क्या वर्तमान कार्यशील निर्देशिका।

दूसरे शब्दों में, foo.Rअपना रास्ता स्वयं जानना होगा। मैं उसे कैसे कर सकता हूँ?


2
No. :( मैंने ऐसा कोई समाधान नहीं देखा है जो वास्तव में काम करता हो। इसके अलावा वर्कअराउंड से सिर्फ डायरेक्टरी को पास करने के लिए या एक पर्यावरण चर का उपयोग करने के लिए।
फ्रैंक 16

3
यह भी पूरी तरह से पोर्टेबल और आर neofites द्वारा निष्पादन योग्य बनाने के लिए अद्भुत होगा!
इटियेन लो-डेकेरी

4
ऐसा लगता है कि सभी उत्तरों के लिए आपको किसी बिंदु पर पथ को इनपुट करने की आवश्यकता है (कम से कम फ़ाइल स्रोत के लिए)! यह बहुत अच्छा होगा यदि आप किसी को एक संपीड़ित फ़ोल्डर भेज सकते हैं और उस फ़ोल्डर के भीतर कोई भी आर स्क्रिप्ट फ़ाइल चला रहे हैं और उस फ़ोल्डर को पढ़ेंगे और सहेज सकते हैं।
इटियेन लो-डेकेरी

10
यह एकल मुद्दा वास्तव में यह कारण बन सकता है कि मैं पायथन
जियाकोमो

5
@giac_man, मुझे लगता है कि आर इस तरह की सैकड़ों छोटी-छोटी समस्याओं से भरा हुआ है, जिन्हें जोड़ने के लिए सभी को काम करना बहुत मुश्किल है।
माइकल बार्टन

जवाबों:


102

यहाँ समस्या का एक सरल समाधान है। यह आदेश:

script.dir <- dirname(sys.frame(1)$ofile)

वर्तमान स्क्रिप्ट फ़ाइल का पथ देता है। यह स्क्रिप्ट के सहेजे जाने के बाद काम करता है।


4
यह मेरे लिए काम नहीं करता है। मैं विंडोज में आर चलाता हूं। कोई उपाय?
एहसान88

4
सहेजे गए स्क्रिप्ट और नए सिरे से स्थापित और विंडोज़ पर R 3.2.0 चलाने के साथ एक ही त्रुटि हुई ...
RalfB

27
यह त्रुटि तब होती है जब आप dirname(sys.frame(1)$ofile)Rstudio से सीधे निष्पादित करने का प्रयास करते हैं । जब स्रोत ("other.R") का उपयोग करके स्क्रिप्ट निष्पादित की जाती है, तो यह ठीक काम करता है और dirname(sys.frame(1)$ofile)अंदर है "other.R"
मुराट

4
Rscript.exe के साथ स्क्रिप्ट के रूप में कॉल करते समय मुझे 'स्टैक पर बहुत सारे फ्रेम' नहीं मिले, अर्थात सोर्स () का उपयोग नहीं करना। इसलिए मुझे नीचे दिए गए सप्रेसिंगफायर से समाधान का उपयोग करना था
मार्क एडम्सन

3
मैं जेल NULLजब यह सर्वर में रखा जाता है। चमकदार का उपयोग करते समय
पॉल

75

आप commandArgsफ़ंक्शन का उपयोग उन सभी विकल्पों को प्राप्त करने के लिए कर सकते हैं जो वास्तविक आर इंटरप्रेटर के लिए रुपयेस्क्रिप्ट द्वारा पारित किए गए थे और उन्हें खोज रहे थे --file=। यदि आपकी स्क्रिप्ट पथ से लॉन्च की गई थी या यदि इसे पूर्ण पथ के साथ लॉन्च किया गया था, तो script.nameनीचे एक के साथ शुरू होगा '/'। अन्यथा, यह सापेक्ष होना चाहिएcwd और पूर्ण पथ प्राप्त करने के लिए आप दो रास्तों को प्राप्त कर सकते हैं।

संपादित करें: ऐसा लगता है कि आपको केवल script.nameऊपर और पथ के अंतिम घटक को बंद करने की आवश्यकता होगी । मैंने अनावश्यक cwd()नमूने को हटा दिया है और मुख्य स्क्रिप्ट को साफ कर दिया है और अपनी पोस्ट की है other.R। बस इस स्क्रिप्ट और other.Rस्क्रिप्ट को एक ही डायरेक्टरी में chmod +xसेव करें, उन्हें, और मुख्य स्क्रिप्ट को रन करें।

मुख्य रु ।:

#!/usr/bin/env Rscript
initial.options <- commandArgs(trailingOnly = FALSE)
file.arg.name <- "--file="
script.name <- sub(file.arg.name, "", initial.options[grep(file.arg.name, initial.options)])
script.basename <- dirname(script.name)
other.name <- file.path(script.basename, "other.R")
print(paste("Sourcing",other.name,"from",script.name))
source(other.name)

अन्य ।:

print("hello")

आउटपुट :

burner@firefighter:~$ main.R
[1] "Sourcing /home/burner/bin/other.R from /home/burner/bin/main.R"
[1] "hello"
burner@firefighter:~$ bin/main.R
[1] "Sourcing bin/other.R from bin/main.R"
[1] "hello"
burner@firefighter:~$ cd bin
burner@firefighter:~/bin$ main.R
[1] "Sourcing ./other.R from ./main.R"
[1] "hello"

मेरा मानना ​​है कि डेहमान की तलाश है।


डाउनडॉम के साथ क्या है?
Suppressingfire

2
मैं निराश हो गया क्योंकि आपकी तकनीक काम नहीं कर रही है sourceजैसा कि मैंने सोचा था कि ओपी चाहता था - लेकिन शायद मैंने उसकी आवश्यकता को गलत बताया। लेकिन मैं अन-
डाउनमॉड

लेकिन वास्तव में, यह स्रोत के साथ ठीक काम करता है! बस स्रोत (other.name) और यह ठीक से काम करता है।
सप्रेसफायर

3
पथ संघटन के लिए, उपयोग करने के लिए बेहतर हैother.name <- file.path(script.basename, "other.R")
जेसन

1
जब मैं commandArgs(trailingOnly = FALSE)चमकदार एप्लिकेशन में सर्वर के अंदर चलने की कोशिश करता हूं, तो मुझे मिलता है [1] "RStudio" "--interactive"। निर्देशिका से इसके बारे में कोई जानकारी नहीं दी गई थी।
पॉल

57

मैं काम करने के लिए सप्रेसफायर समाधान नहीं पा सका जब 'कंसोल' आर कंसोल से।
जब रुपये का उपयोग करते हुए मुझे काम करने के लिए हेडली का समाधान नहीं मिला।

दोनों ओर से लाभदायक?

thisFile <- function() {
        cmdArgs <- commandArgs(trailingOnly = FALSE)
        needle <- "--file="
        match <- grep(needle, cmdArgs)
        if (length(match) > 0) {
                # Rscript
                return(normalizePath(sub(needle, "", cmdArgs[match])))
        } else {
                # 'source'd via R console
                return(normalizePath(sys.frames()[[1]]$ofile))
        }
}

6
मुझे यह पसंद है क्योंकि यह आर Rscriptऔर दोनों के साथ काम करता source()है। मैं normalizePath()दोनों संस्करणों पर करना चाहूंगा , ताकि यह दोनों मामलों में पूरा रास्ता दे।
wch

1
बस यही एक काम है। ध्यान दें, इसके लिए काम करने के लिए library(base)मुझे थोड़ी देर लग गई थी कि मैं बाहर निकल
आया

2
आप सर को मेरा वोट दिलवाएं, क्योंकि यही वह समाधान है जो मेरे लिए काम करता है
विंस डब्ल्यू।

1
इस किसी को भी मदद करता है, तो मूल पोस्ट के लिए, इसका मतलब यह होगा source(file.path(dirname(thisFile()), "other.R"))में foo.R। यह मेरे लिए काम करता है।
किम

एक मुद्दा। RStudio I स्रोत में मान लीजिए कि main.Rकौन से स्रोत helper.Rकॉल करते हैं thisFile()। इसके main.Rबदले रास्ता मिलेगा helper.R। कोई सुझाव यहाँ?
वासादामो

37
frame_files <- lapply(sys.frames(), function(x) x$ofile)
frame_files <- Filter(Negate(is.null), frame_files)
PATH <- dirname(frame_files[[length(frame_files)]])

मुझसे मत पूछो कि यह कैसे काम करता है, क्योंकि मैं भूल गया हूँ: /


2
वह किस संदर्भ में काम करता है? जब मैं इसे चलाता हूं, तो प्रिंट (sys.frames ()) खुल जाता है।
Suppressingfire

1
@ सप्रेसिंगफायर: sys.framesकॉल स्टैक का वातावरण देता है, इसलिए यह केवल एक फ़ंक्शन से कॉल करने पर वास्तव में समझ में आता है। कोशिश करो, जैसे foo <- function() {bar <- function() print(sys.frames()); bar()}; foo()। मैं @ हैडली कोड का पता नहीं लगा सकता, क्योंकि वातावरण में कोई ofileसदस्य नहीं है ।
रिची कॉटन

1
आपको फ़ाइल को स्रोत में रखना होगा - यानी यदि मैं उस कोड को सहेजता हूं source("~/code/test.r"), तो चलाएं , पर PATHसेट हो जाएगा ~/desktop। यदि आप शीर्ष स्तर पर इसका मूल्यांकन करते हैं, तो यह NULL को लौटा देगा।
हैडले

4
यह मेरे प्रश्न का उत्तर नहीं देता है। मुझे "अन्य" फ़ाइल को स्वचालित रूप से खोजने की आवश्यकता है। x$ofileअपरिभाषित है, इसलिए frame_filesखाली है।
फ्रैंक

@ अहदली, बहुत उपयोगी कोड। जब वे सक्रिय विकास में होते हैं तो मैं लगभग सभी लिपियों में "पुन: लोड होने वाली वर्तमान स्क्रिप्ट" उपयोगिता फ़ंक्शन को सामान्यीकृत करने में सक्षम था। RScript रीलोडर
सिम

29

यह मेरे लिए काम करता है

library(rstudioapi)    
rstudioapi::getActiveDocumentContext()$path

4
यह केवल RStudio I के अंदर से काम करता है। मुझे मिलने वाले टर्मिनल से कोशिश करना Error: RStudio not running
इस्टा

अधिक विशेष रूप से यह काम करता है, अगर आर स्टूडियो में एक आर स्क्रिप्ट से चलाया जाता है। यहां तक ​​कि RStudio में कंसोल पर यह ""मेरे मामले में सही परिणाम नहीं देगा
Kay

26

एक आर स्क्रिप्ट के पथ से रेकेंसी का उत्तर सबसे सही और वास्तव में शानदार IMHO है। फिर भी, यह अभी भी एक डमी फ़ंक्शन को शामिल करने वाला हैक है। मैं इसे यहां उद्धृत कर रहा हूं, ताकि दूसरों को आसानी से मिल सके।

sourceDir <- getSrcDirectory (फ़ंक्शन (डमी) {dummy})

यह उस फ़ाइल की निर्देशिका देता है जहाँ कथन रखा गया था (जहाँ डमी फ़ंक्शन परिभाषित है)। तब इसका उपयोग कार्यशील डायररी को सेट करने और सापेक्ष पथों का उपयोग करने के लिए किया जा सकता है

setwd(sourceDir)
source("other.R")

या निरपेक्ष पथ बनाने के लिए

 source(paste(sourceDir, "/other.R", sep=""))

1
मेरे लिए, आपका समाधान सबसे अच्छा था। विशेष रूप से क्योंकि यह एक चमकदार एप्लिकेशन पर लागू किया जा सकता है और लिंक पर एक नहीं।
11

1
यहाँ getSrcDirectory बर्तन है :: getSrcDirectory
RubenLaguna

5
यह लिनक्स / मैक के तहत अच्छी तरह से काम कर सकता है, लेकिन यह विंडोज के तहत एक इंटरेक्टिव RStudio सत्र में मेरे लिए काम नहीं करता था। sourceDirखाली था।
कंटैंगो

1
एक इंटरैक्टिव टर्मिनल पर @ कांटो, कोई रास्ता नहीं है !!! आप किसी फ़ाइल का पथ चाहते हैं।
pommedeterresautee

1
मुझे मिल रहा है character(0)। सुझाव?
अबल्टर

16

मेरा सब एक में! (-01 / 09/2019 RStudio कंसोल से निपटने के लिए अपडेट किया गया)

#' current script file (in full path)
#' @description current script file (in full path)
#' @examples
#' works with Rscript, source() or in RStudio Run selection, RStudio Console
#' @export
ez.csf <- function() {
    # http://stackoverflow.com/a/32016824/2292993
    cmdArgs = commandArgs(trailingOnly = FALSE)
    needle = "--file="
    match = grep(needle, cmdArgs)
    if (length(match) > 0) {
        # Rscript via command line
        return(normalizePath(sub(needle, "", cmdArgs[match])))
    } else {
        ls_vars = ls(sys.frames()[[1]])
        if ("fileName" %in% ls_vars) {
            # Source'd via RStudio
            return(normalizePath(sys.frames()[[1]]$fileName))
        } else {
            if (!is.null(sys.frames()[[1]]$ofile)) {
            # Source'd via R console
            return(normalizePath(sys.frames()[[1]]$ofile))
            } else {
                # RStudio Run Selection
                # http://stackoverflow.com/a/35842176/2292993
                pth = rstudioapi::getActiveDocumentContext()$path
                if (pth!='') {
                    return(normalizePath(pth))
                } else {
                    # RStudio Console
                    tryCatch({
                            pth = rstudioapi::getSourceEditorContext()$path
                            pth = normalizePath(pth)
                        }, error = function(e) {
                            # normalizePath('') issues warning/error
                            pth = ''
                        }
                    )
                    return(pth)
                }
            }
        }
    }
}

इंटरेक्टिव आर सत्र के साथ काम नहीं करता है; मैं प्राप्त कर रहा हूँ: `` `स्रोत (" csf.R ")> सीएसएफ () त्रुटि: RStudio` `` नहीं चल रहा है
ManicMailman

यह भी खूब रही। क्या कोई पैकेज बना सकता है?
जो फ्लैक

13

सुपरसीफ़ायर के जवाब का एक पतला संस्करण:

source_local <- function(fname){
    argv <- commandArgs(trailingOnly = FALSE)
    base_dir <- dirname(substring(argv[grep("--file=", argv)], 8))
    source(paste(base_dir, fname, sep="/"))
}

यह पुनरावृत्ति से काम नहीं किया; फ़ाइल I स्रोत डेटा फ़ाइल (लेकिन गलत निर्देशिका में) के लिए दिखता है।
अनफिन कैट

11

यह मेरे लिए काम करता है। बस इसे कमांड लाइन के तर्कों से बाहर निकालता है, अनचाहे टेक्स्ट को स्ट्रिप करता है, एक dirname करता है और अंत में उससे पूरा रास्ता प्राप्त करता है:

args <- commandArgs(trailingOnly = F)  
scriptPath <- normalizePath(dirname(sub("^--file=", "", args[grep("^--file=", args)])))

8

मैंने इस प्रश्न के उत्तरों को rprojroot में एक नए फ़ंक्शन thisfile()में लपेटा और बढ़ाया है । इसके साथ बुनाई के लिए भी काम करता है ।knitr


6

मुझे स्टीमर 25 का समाधान पसंद आया क्योंकि यह मेरे उद्देश्यों के लिए सबसे अधिक मजबूत लगता है। हालाँकि, जब RStudio (विंडोज़ में) में डिबगिंग होती है, तो रास्ता ठीक से सेट नहीं होता है। इसका कारण यह है कि यदि RStudio में एक ब्रेकपॉइंट सेट किया गया है, तो फ़ाइल को सोर्स करना एक वैकल्पिक "डिबग स्रोत" कमांड का उपयोग करता है जो स्क्रिप्ट पथ को थोड़ा अलग तरीके से सेट करता है। यहां अंतिम संस्करण है जो मैं वर्तमान में डीबगिंग के दौरान RStudio के भीतर इस वैकल्पिक व्यवहार के लिए कौन से खातों का उपयोग कर रहा हूं:

# @return full path to this script
get_script_path <- function() {
    cmdArgs = commandArgs(trailingOnly = FALSE)
    needle = "--file="
    match = grep(needle, cmdArgs)
    if (length(match) > 0) {
        # Rscript
        return(normalizePath(sub(needle, "", cmdArgs[match])))
    } else {
        ls_vars = ls(sys.frames()[[1]])
        if ("fileName" %in% ls_vars) {
            # Source'd via RStudio
            return(normalizePath(sys.frames()[[1]]$fileName)) 
        } else {
            # Source'd via R console
            return(normalizePath(sys.frames()[[1]]$ofile))
        }
    }
}

Rstudio में स्रोत मेरे लिए निष्क्रिय है, लेकिन debugSource ने फ़ाइलनाम दिया इसलिए आपका समाधान अच्छी तरह से काम करता है, लेकिन कोड टिप्पणियां मेरे मामले में बिल्कुल सही नहीं हैं
मार्क एडम्सन

6

मैं इस सवाल से लगभग सब कुछ करने की कोशिश की, एक अनुसंधान स्क्रिप्ट के रास्ते हो रही है , वर्तमान स्क्रिप्ट के रास्ते जाओ , वर्तमान .R फ़ाइल का स्थान का पता लगाएं और Rstudio में स्रोत फ़ाइल स्थान के लिए काम कर निर्देशिका स्थापित करने के लिए आर आदेश , लेकिन अंत में अपने आप मैन्युअल रूप से पाया CRAN तालिका ब्राउज़ करना और पाया गया

scriptName पुस्तकालय

जो current_filename()फ़ंक्शन प्रदान करता है, जो RStudio में सोर्सिंग करते समय स्क्रिप्ट का उचित पूर्ण पथ देता है और आर या आरएसस्क्रिप्ट निष्पादन योग्य के माध्यम से इनवॉइस करते समय भी।


1
Package ‘scriptName’ was removed from the CRAN repository.- अब क्या? : ओ
बोजन पी। २

3

मुझे भी यह समस्या थी, और उपरोक्त किसी भी समाधान ने मेरे लिए काम नहीं किया। शायद के साथsource या इस तरह की चीजों के , लेकिन यह पर्याप्त स्पष्ट नहीं था।

मुझे यह मिला, मेरे लिए सुरुचिपूर्ण, समाधान:

paste0(gsub("\\", "/", fileSnapshot()$path, fixed=TRUE),"/")

इसमें महत्वपूर्ण बात यह है fileSnapshot()कि यह आपको एक फ़ाइल के बारे में बहुत सारी जानकारी देता है। यह 8 तत्वों की सूची देता है। जब आप pathसूची तत्व के रूप में चुनते हैं , तो पथ \\विभाजक के रूप में वापस आ जाता है, इसलिए बाकी कोड बस इसे बदलना है।

आशा है कि ये आपकी मदद करेगा।


1
यह मेरे लिए लिनक्स मशीन पर काम नहीं करता था; फ़ाइल का पथ वापस करने के बजाय, उसने वह निर्देशिका वापस कर दी जो मैं वर्तमान में स्थित था। मैंने TEST.R नामक एक परीक्षण स्क्रिप्ट बनाई जिसमें कोड की एक पंक्ति है: प्रिंट (fileSnapshot () $ पथ) मैंने इसे इस फ़ोल्डर में सहेजा है: / ऑप्ट / होम / boops / डेस्कटॉप / टेस्टफ़ोल्डर / TEST.RI फिर मेरे डेस्कटॉप पर नेविगेट किया गया और फ़ाइल को चलाने का प्रयास किया गया: boops @ linuxserver: ~ / Desktop $ Rscript /opt/home/boops/Desktop/Testfolder/TEST.R [1] ] "/ ऑप्ट / होम / बूम / डेस्कटॉप"
Boops Boops

मेरे लिए भी काम नहीं किया। 'यहाँ' पुस्तकालय का उपयोग करते समय 'यहाँ ()' जैसी ही चीज़ लौटाता है। इसने मेरे वर्तमान आर प्रोजेक्ट को वापस लौटा दिया, लेकिन बहुत ही फ़ाइल को ही निष्पादित नहीं किया गया।
जो फ्लैक

2

आप r स्क्रिप्ट को एक bash स्क्रिप्ट में लपेट सकते हैं और स्क्रिप्ट के मार्ग को bash वेरिएबल की तरह पुनः प्राप्त कर सकते हैं:

#!/bin/bash
     # [environment variables can be set here]
     path_to_script=$(dirname $0)

     R --slave<<EOF
        source("$path_to_script/other.R")

     EOF

3
इसके लिए आपको स्क्रिप्ट का रास्ता अपनाना होगा। यह आपको वास्तव में पोर्टेबल आर स्क्रिप्ट बनाने की अनुमति नहीं देता है जो कहीं से भी चल सकती है।
इटियेन लो-डेकेरी

@ एटिनेलो-डेकेरी इसे स्क्रिप्ट पथ की आवश्यकता नहीं है, इसे बैश से प्राप्त किया जाता है। मुख्य मुद्दा यह है कि यह रास्ता पाने के लिए एक विश्वसनीय तरीका नहीं है। कुछ ऐसा ही पसंद किया जाता है, जैसा कि stackoverflow.com/questions/59895/… path_to_script = "$ (cd" $ (dirname "$ {BASH_SOURCE [0]}") "" और + pwd) "
जॉन हैबरस्ट्रोह

2

मुझे यह तरीका पसंद है:

this.file <- sys.frame(tail(grep('source',sys.calls()),n=1))$ofile
this.dir <- dirname(this.file)

2

मैंने बस खुद ही यह काम किया है। अपनी स्क्रिप्ट की पोर्टेबिलिटी हमेशा सुनिश्चित करने के लिए इसे इसके साथ शुरू करें:

wd <- setwd(".")
setwd(wd)

यह काम करता है क्योंकि "।" यूनिक्स कमांड $ PWD की तरह अनुवाद करता है। इस स्ट्रिंग को किसी कैरेक्टर ऑब्जेक्ट को असाइन करने से आप उस कैरेक्टर ऑब्जेक्ट को setwd () और प्रेस्टो में सम्मिलित कर सकते हैं आपका कोड हमेशा वर्किंग डायरेक्टरी के रूप में अपनी करंट डाइरेक्टरी के साथ चलेगा, कोई फर्क नहीं पड़ता कि यह किस मशीन पर है या फाइल स्ट्रक्चर में कहां है। स्थित है। (अतिरिक्त बोनस: wd ऑब्जेक्ट का उपयोग file.path () के साथ किया जा सकता है (यानी। file.path (wd, "output_directory") मानक आउटपुट निर्देशिका के निर्माण के लिए अनुमति देने के लिए फ़ाइल नाम के बिना आपकी निर्देशिका में ले जाने के लिए। इस तरह से संदर्भित करने से पहले आपको नई निर्देशिका बनाने की आवश्यकता होती है लेकिन वह भी, wd ऑब्जेक्ट के साथ सहायता प्राप्त की जा सकती है।

वैकल्पिक रूप से, निम्न कोड सटीक समान कार्य करता है:

wd <- getwd()
setwd(wd)

या, यदि आपको किसी ऑब्जेक्ट में फ़ाइल पथ की आवश्यकता नहीं है, तो आप बस कर सकते हैं:

setwd(".")

11
नहीं। यह प्रक्रिया की निर्देशिका को ढूँढता है, न कि फ़ाइल को।
user1071847

यह इंटरैक्टिव मोड में RStudio के साथ विंडोज में मेरे लिए काम करता था।
कंटैंगो

2

ध्यान दें कि गेटटॉप पैकेज get_Rscript_filenameफ़ंक्शन प्रदान करता है , जो यहां प्रस्तुत एक ही समाधान का उपयोग करता है, लेकिन पहले से ही आपके लिए एक मानक आर मॉड्यूल में लिखा गया है, इसलिए आपको हर स्क्रिप्ट में "स्क्रिप्ट स्क्रिप्ट प्राप्त करें" फ़ंक्शन को कॉपी और पेस्ट करने की आवश्यकता नहीं है। तुम लिखो।


यह हमेशा NA लौटाता है, भले ही मैं एक स्क्रिप्ट बनाता हूं जो इसके आउटपुट को प्रिंट करता है और फिर स्क्रिप्ट को कॉल करता है जैसेR -e "library(getopt); testscript.R"
bokov

1
जैसा कि फ़ंक्शन का नाम है, आपको अपनी स्क्रिप्ट का उपयोग करके चलाने की आवश्यकता है Rscript
रयान सी। थॉम्पसन

आह, उफ़। धन्यवाद।
बोकोव

1

देखें findSourceTraceback()की R.utils पैकेज है, जो

सभी कॉल फ़्रेमों में स्रोत () द्वारा उत्पन्न सभी 'srcfile' ऑब्जेक्ट को ढूँढता है। इससे यह पता लगाना संभव हो जाता है कि वर्तमान में कौन सी फाइलें स्रोत द्वारा स्क्रिप्टित हैं ()।


1

मेरे पास उपरोक्त कार्यान्वयन के साथ समस्याएँ थीं क्योंकि मेरी स्क्रिप्ट एक सिम्लिंकड डायरेक्टरी से संचालित है, या कम से कम मुझे यही लगता है कि उपरोक्त समाधान मेरे लिए कारगर नहीं थे। @ Ennuikiller के उत्तर की पंक्तियों के साथ, मैंने अपने नोटस्क्रिप्ट को बैश में लपेटा। मैंने पथ चर का उपयोग करके सेट किया है pwd -P, जो सिम्प्लाइड डायरेक्टरी संरचनाओं को हल करता है। फिर मार्ग को रुपयेलेख में पास करें।

Bash.sh

#!/bin/bash

# set path variable
path=`pwd -P`

#Run Rscript with path argument
Rscript foo.R $path

foo.R

args <- commandArgs(trailingOnly=TRUE)
setwd(args[1])
source(other.R)

1

मैं @ steamer25 के दृष्टिकोण के एक संस्करण का उपयोग करूंगा। मुद्दा यह है कि मैं आखिरी खटास वाली स्क्रिप्ट प्राप्त करना पसंद करता हूं, तब भी जब मेरा सत्र रुख के माध्यम से शुरू किया गया था। निम्नलिखित स्निपेट, जब एक फ़ाइल पर शामिल किया जाता है, thisScriptतो स्क्रिप्ट का सामान्यीकृत पथ युक्त एक चर प्रदान करेगा । मैं source'ing के उपयोग को स्वीकार करता हूं, इसलिए कभी-कभी मैं रुपये का आह्वान करता हूं और --fileतर्क स्रोत में प्रदान की गई स्क्रिप्ट किसी अन्य स्क्रिप्ट को स्रोत बनाती है ... किसी दिन मैं अपना गन्दा कोड पैकेज में बदल जाता हूं।

thisScript <- (function() {
  lastScriptSourced <- tail(unlist(lapply(sys.frames(), function(env) env$ofile)), 1)

  if (is.null(lastScriptSourced)) {
    # No script sourced, checking invocation through Rscript
    cmdArgs <- commandArgs(trailingOnly = FALSE)
    needle <- "--file="
    match <- grep(needle, cmdArgs)
    if (length(match) > 0) {
      return(normalizePath(sub(needle, "", cmdArgs[match]), winslash=.Platform$file.sep, mustWork=TRUE))
    }
  } else {
    # 'source'd via R console
    return(normalizePath(lastScriptSourced, winslash=.Platform$file.sep, mustWork=TRUE))
  }
})()

1

आपके द्वारा उपयोग किए जाने वाले 99% मामले:

sys.calls()[[1]] [[2]]

यह पागल कॉल के लिए काम नहीं करेगा जहां स्क्रिप्ट पहला तर्क नहीं है, अर्थात source(some args, file="myscript")। इन फैंसी मामलों में @ हैडली का उपयोग करें।


RStudio के भीतर से नहीं, हालाँकि, सोर्सिंग के अलावा
nJGL

1

स्टीमर 25 का दृष्टिकोण काम करता है, लेकिन केवल अगर मार्ग में कोई व्हाट्सएप नहीं है। कम से कम cmdArgs[match]कुछ के /base/some~+~dir~+~with~+~whitespace/लिए macOS पर /base/some\ dir\ with\ whitespace/

मैंने इसे वापस करने से पहले एक साधारण व्हाट्सएप के साथ "~ + ~" को बदलकर इसके चारों ओर काम किया।

thisFile <- function() {
  cmdArgs <- commandArgs(trailingOnly = FALSE)
  needle <- "--file="
  match <- grep(needle, cmdArgs)
  if (length(match) > 0) {
    # Rscript
    path <- cmdArgs[match]
    path <- gsub("\\~\\+\\~", " ", path)
    return(normalizePath(sub(needle, "", path)))
  } else {
    # 'source'd via R console
    return(normalizePath(sys.frames()[[1]]$ofile))
  }
}

जाहिर है आप अभी भी अन्य ब्लॉक का विस्तार कर सकते हैं जैसे कि एप्रस्टार ने किया।


1

यदि स्क्रिप्ट के बजाय foo.R, इसके पथ स्थान को जानने के बाद, यदि आप अपने कोड को हमेशा sourceएक आम से सभी 'डी' संदर्भों में बदल सकते हैं, rootतो ये एक बड़ी मदद हो सकती है:

दिया हुआ

  • /app/deeply/nested/foo.R
  • /app/other.R

यह काम करेगा

#!/usr/bin/env Rscript
library(here)
source(here("other.R"))

प्रोजेक्ट जड़ों को कैसे परिभाषित करें, इसके लिए https://rprojroot.r-lib.org/ देखें ।


मेरे लिए यहाँ पैकेज बिल्कुल काम करता है और लगता है कि एक आसान उपाय है
Ron

0
#!/usr/bin/env Rscript
print("Hello")

# sad workaround but works :(
programDir <- dirname(sys.frame(1)$ofile)
source(paste(programDir,"other.R",sep='/'))
source(paste(programDir,"other-than-other.R",sep='/'))

मुझे अभी भी त्रुटि "sys.frame (1) में त्रुटि मिलती है: स्टैक पर कई फ्रेम नहीं"
माइकल बार्टन

0

कमाल है आर में कोई '$ 0' प्रकार की संरचना नहीं है! आप इसे एक सिस्टम के साथ कर सकते हैं () R में लिखी एक बैश स्क्रिप्ट पर कॉल करें:

write.table(c("readlink -e $0"), file="scriptpath.sh",col=F, row=F, quote=F)
thisscript <- system("sh scriptpath.sh", intern = TRUE)

तो बस अन्य के लिए scriptpath.sh नाम को विभाजित करें

splitstr <- rev(strsplit(thisscript, "\\/")[[1]])
otherscript <- paste0(paste(rev(splitstr[2:length(splitstr)]),collapse="/"),"/other.R")

मुझे एक त्रुटि संदेश मिलाreadLink: illegal option -- e usage: readLink [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
altabq

0

कॉल स्टैक को देखकर हम निष्पादित की जा रही प्रत्येक स्क्रिप्ट की फ़ाइलपथ प्राप्त कर सकते हैं, दो सबसे उपयोगी शायद या तो वर्तमान में स्क्रिप्ट निष्पादित कर रहे हैं, या पहली स्क्रिप्ट को स्रोत (प्रविष्टि) किया जाएगा।

script.dir.executing = (function() return( if(length(sys.parents())==1) getwd() else dirname( Filter(is.character,lapply(rev(sys.frames()),function(x) x$ofile))[[1]] ) ))()

script.dir.entry = (function() return( if(length(sys.parents())==1) getwd() else dirname(sys.frame(1)$ofile) ))()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.