2010-08-10 13 views
55

क्या स्क्रिप्ट के अंदर प्रोग्रामिंग रूप से आर स्क्रिप्ट का पथ खोजने का कोई तरीका है?एक आर स्क्रिप्ट का मार्ग प्राप्त करना

मैं यह पूछ रहा हूं क्योंकि मेरे पास RGtk2 का उपयोग करने वाली कई स्क्रिप्ट हैं और एक .glade फ़ाइल से एक GUI लोड करें।

इन लिपियों में मुझे शुरुआत में setwd("path/to/the/script") निर्देश डालने के लिए बाध्य किया गया है, अन्यथा .glade फ़ाइल (जो एक ही निर्देशिका में है) नहीं मिलेगी।

यह ठीक है, लेकिन अगर मैं एक अलग निर्देशिका में या किसी अन्य कंप्यूटर में स्क्रिप्ट को स्थानांतरित करता हूं तो मुझे पथ बदलना होगा। मैं जानता हूँ कि, यह एक बड़ी बात नहीं है, लेकिन यह कुछ ऐसा है करने के लिए अच्छा होगा:

setwd(getScriptPath())

तो, एक समान कार्य मौजूद है?

+1

यह विशेष रूप से इंटरैक्टिव सत्रों में उपयोगी होगा, जैसे कि Rstudio का उपयोग करते समय। – Quantum7

+0

ऐसा लगता है कि इनमें से कई "फ़ाइल के लिए पथ" समस्याओं को अब पैकेज rprojroot के साथ हल किया जा सकता है: https://cran.r-project.org/web/packages/rprojroot/index.html। rprojroot खुद को "rprojroot: परियोजना उपनिर्देशिका में फ़ाइलें ढूँढना" के रूप में बिल। इंटरैक्टिव उपयोग के लिए 'हल्के वजन' संस्करण यहां पैकेज है: https://github.com/krlmlr/here। – BarkleyBG

उत्तर

18

उपयोग source("yourfile.R", chdir = T)

+0

ओह, अच्छा, उस बारे में नहीं पता था! धन्यवाद! – nico

+2

@ निको मैं आर के लिए नया हूं और मैं भी इसी तरह की चीज करना चाहता था। मैंने इस समाधान की कोशिश की लेकिन मुझे एक त्रुटि मिली है 'त्रुटि:' ... 'गलत संदर्भ में प्रयोग किया जाता है', क्या आप टिप्पणी कर सकते हैं कि समस्या क्या हो सकती है? – Dronacharya

+1

@ द्रोणाचार्य: आसान! '...' फाइलनाम के लिए सिर्फ प्लेसहोल्डर हैं! उस फ़ाइल का नाम दें जिसे आप शामिल करना चाहते हैं और आप – nico

4

यदि आप अपने कोड को पैकेज में लपेटते हैं, तो आप हमेशा पैकेज निर्देशिका के कुछ हिस्सों से पूछ सकते हैं। - और system.file() आप के लिए पथ की गणना करेगा

> system.file("ui", "demo.ui", package="RGtk2") 
[1] "C:/opt/R/library/RGtk2/ui/demo.ui" 
> 

आप अपने स्रोतों में एक निर्देशिका inst/glade/ जो स्थापित पैकेज में एक निर्देशिका glade/ बन जाएगा के साथ भी ऐसा कर सकते हैं:
यहाँ RGtk2 पैकेज से एक उदाहरण है स्थापित होने पर, ओएस के बावजूद।

+0

धन्यवाद Dirk। मुझे वास्तव में पैकेज में अपनी स्क्रिप्ट डालने के बारे में शुरू करना होगा और सोचना होगा ... मुझे लगता है कि आपके उत्तर से पैकेज के बाहर ऐसा करने का कोई तरीका नहीं है? – nico

+1

आप किसी और चीज को झुका सकते हैं - एक पर्यावरण चर सेट करें और क्वेरी करें, या उस तर्क को हटा दें जो स्क्रिप्ट नाम को आर को प्रदान करता है, या ... लेकिन कुछ सरल, परीक्षण, विश्वसनीय और उद्देश्य के लिए क्यों नहीं उपयोग किया जाता है? ;-) –

+0

ओह, ज़ाहिर है, बस सोच रहा था कि क्या कोई अन्य समाधान था! धन्यवाद! – nico

6

शोषण निहित "--file" Rscript का तर्क

जब "Rscript" का उपयोग स्क्रिप्ट बुला (Rscript doc) स्क्रिप्ट का पूरा पथ के लिए एक प्रणाली पैरामीटर के रूप में दिया जाता है । निम्नलिखित समारोह का शोषण करने वाली इस स्क्रिप्ट निर्देशिका को निकालने के लिए:

getScriptPath <- function(){ 
    cmd.args <- commandArgs() 
    m <- regexpr("(?<=^--file=).+", cmd.args, perl=TRUE) 
    script.dir <- dirname(regmatches(cmd.args, m)) 
    if(length(script.dir) == 0) stop("can't determine script dir: please call the script with Rscript") 
    if(length(script.dir) > 1) stop("can't determine script dir: more than one '--file' argument detected") 
    return(script.dir) 
} 
+1

जब मैं इसे चलाता हूं (उबंटू 15.10 पर आर 3.2 के साथ।3), तर्क '- फ़ाइल' में पूरा पथ नहीं है, इसलिए लौटाई गई स्क्रिप्ट डीआईआर खाली है: '' डैनियल @ कंप्यूटर: ~/डेटा $ प्रतिलेख स्क्रिप्ट। आर /usr/lib/R/bin/exec/r --slave --no-restore --file = Script.R '' – daniel

+0

मेरे लिए काम करता है (win7, r3.4)। – mdag02

3

इस उत्तर मेरे लिए ठीक काम करता है:

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

नोट: स्क्रिप्ट आदेश सही पथ

मैंने पाया वापस जाने के लिए के स्रोत वाली जाना चाहिए इसमें: https://support.rstudio.com/hc/communities/public/questions/200895567-can-user-obtain-the-path-of-current-Project-s-directory-

लेकिन मुझे अभी भी समझ में नहीं आता कि sys.frame (1) $ शौचालय क्या है। मुझे आर दस्तावेज़ीकरण में इसके बारे में कुछ भी नहीं मिला। कोई इसे समझा सकता है?

+0

हां। बिना स्रोत के, किसी को निम्न त्रुटि मिलती है: डायरनाम में त्रुटि (parent.frame (2) $ ofile): एक वर्ण वेक्टर तर्क –

+2

अपेक्षित है क्योंकि यह मुख्य आर स्क्रिप्ट के लिए काम नहीं करता है। –

33

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

getSrcDirectory(function(x) {x}) 

ऐसा अनाम समारोह (कि कुछ नहीं करता है) स्क्रिप्ट के अंदर परिभाषित करता है, और फिर उस समारोह है, जो निर्देशिका है जहाँ स्क्रिप्ट है के स्रोत निर्देशिका निर्धारित करता है।

+21

यह मेरे लिए लिनक्स आर 3.2.4 पर काम नहीं करता है। आउटपुट खाली है। – biocyberman

+1

3.3.2 में मेरे लिए काम करता है। @biocyberman: क्या आप इसे कंसोल से बुला रहे हैं? क्योंकि यह मेरे लिए वहां खाली हो जाता है। यदि एक स्क्रिप्ट से, क्या आप इसे प्रिंट कर रहे हैं? (इसी तरह, यह Rstudio से स्रोत करते समय काम करता है, कोड चलाने पर नहीं बॉट)। – naught101

+1

ओएसएक्स 10.11.6 पर 3.3.2 में काम करता है लेकिन केवल जब RStudio में स्क्रिप्ट को सोर्स करते हैं, @ naught101 ने लिखा था। कंसोल में कॉल करते समय खाली हो जाता है या जब सीएमडी-स्क्रिप्ट विंडो में लाइन लौटाता है। – mattek

22

RStudio केवल के लिए:

setwd(dirname(rstudioapi::getActiveDocumentContext()$path)) 

यह काम करता है जब भागो निंग या स्रोत अपनी फ़ाइल ing।

+0

मेरे लिए काम नहीं किया। मुझे इसका उपयोग करना था: setwd (dirname (rstudioapi :: callFun ("getActiveDocumentContext") $ पथ) अन्यथा: महान समाधान - धन्यवाद – MarkusN

+1

लोड नाम में त्रुटि नाम (नाम): 'rstudioapi' –

+1

@HillarySanders नामक कोई पैकेज नहीं है, install.packages ("rstudioapi") '? –

1
#' current script dir 
#' @param 
#' @return 
#' @examples 
#' works with source() or in RStudio Run selection 
#' @export 
z.csd <- function() { 
    # http://stackoverflow.com/questions/1815606/rscript-determine-path-of-the-executing-script 
    # must work with source() 
    if (!is.null(res <- .thisfile_source())) res 
    else if (!is.null(res <- .thisfile_rscript())) dirname(res) 
    # http://stackoverflow.com/a/35842176/2292993 
    # RStudio only, can work without source() 
    else dirname(rstudioapi::getActiveDocumentContext()$path) 
} 
# Helper functions 
.thisfile_source <- function() { 
    for (i in -(1:sys.nframe())) { 
     if (identical(sys.function(i), base::source)) 
      return (normalizePath(sys.frame(i)$ofile)) 
    } 

    NULL 
} 
.thisfile_rscript <- function() { 
    cmdArgs <- commandArgs(trailingOnly = FALSE) 
    cmdArgsTrailing <- commandArgs(trailingOnly = TRUE) 
    cmdArgs <- cmdArgs[seq.int(from=1, length.out=length(cmdArgs) - length(cmdArgsTrailing))] 
    res <- gsub("^(?:--file=(.*)|.*)$", "\\1", cmdArgs) 

    # If multiple --file arguments are given, R uses the last one 
    res <- tail(res[res != ""], 1) 
    if (length(res) > 0) 
     return (res) 

    NULL 
} 
0

सिस्टम और खोल आदेशों का उपयोग करने के बारे में कैसे? विंडोज़ के साथ, मुझे लगता है कि जब आप RStudio में स्क्रिप्ट खोलते हैं तो यह वर्तमान खोल निर्देशिका को स्क्रिप्ट की निर्देशिका में सेट करता है। आपको सीडी सी: \ उदा। या जो भी ड्राइव आप खोजना चाहते हैं उसे जोड़ना पड़ सकता है (उदा। खोल ('डीआईआर सी: \\ * file_name/s', intern = TRUE) - \\ बचने वाले चरित्र से बचने के लिए)। केवल विशिष्ट नामित फ़ाइलों के लिए ही काम करेगा जब तक आप उपनिर्देशिका निर्दिष्ट नहीं करते हैं (लिनक्स के लिए मैंने/से खोजना शुरू कर दिया है)। किसी भी मामले में, यदि आप जानते हैं कि खोल में कुछ कैसे ढूंढें, तो यह आर के भीतर इसे खोजने और निर्देशिका को वापस करने के लिए एक लेआउट प्रदान करता है। काम करना चाहिए कि क्या आप स्क्रिप्ट को सोर्सिंग या चला रहे हैं लेकिन मैंने संभावित बग की पूरी तरह से खोज नहीं की है।

#Get operating system 
OS<-Sys.info() 
win<-length(grep("Windows",OS)) 
lin<-length(grep("Linux",OS)) 

#Find path of data directory 
#Linux Bash Commands 
if(lin==1){ 
    file_path<-system("find/-name 'file_name'", intern = TRUE) 
    data_directory<-gsub('/file_name',"",file_path) 
} 
#Windows Command Prompt Commands 
if(win==1){ 
    file_path<-shell('dir file_name /s', intern = TRUE) 
    file_path<-file_path[4] 
    file_path<-gsub(" Directory of ","",file_path) 
    filepath<-gsub("\\\\","/",file_path) 
    data_directory<-file_path 
} 

#Change working directory to location of data and sources 
setwd(data_directory) 
संबंधित मुद्दे