Pobieranie ścieżki skryptu R

Czy istnieje sposób, aby programowo znaleźć ścieżkę skryptu R wewnątrz samego skryptu?

Pytam, ponieważ mam kilka skryptów, które używają {[0] } i ładują GUI z .Glade file.

W tych skryptach mam obowiązek umieścić setwd("path/to/the/script") instrukcję na początku, w przeciwnym razie .plik glade (który znajduje się w tym samym katalogu) nie zostanie znaleziony.

Jest w porządku, ale jeśli przeniosę skrypt do innego katalogu lub na inny komputer, muszę zmienić ścieżkę. I wiem, to nic wielkiego, ale miło byłoby mieć coś w stylu:

setwd(getScriptPath())

Czy istnieje podobna funkcja?

 57
Author: nico, 2010-08-10

8 answers

Użyj source("yourfile.R", chdir = T)

 21
Author: hadley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-18 09:06:45

To działa dla mnie:

getSrcDirectory(function(x) {x})

Definiuje to funkcję anonimową (która nic nie robi) wewnątrz skryptu, a następnie określa katalog źródłowy tej funkcji, czyli katalog, w którym znajduje się skrypt.

 33
Author: rakensi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-18 15:00:27

Tylko dla RStudio:

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

Działa to, gdy uruchamia ning lub Źródło w Twoim pliku.

 24
Author: Richie Cotton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-22 18:32:33

Wykorzystanie domyślnego argumentu "-- file " Rscript

Podczas wywołania skryptu za pomocą "Rscript" (rscript doc) Pełna ścieżka skryptu jest podawana jako parametr systemowy. Poniższa funkcja wykorzystuje to do wyodrębnienia katalogu skryptu:

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)
}
 6
Author: Bernhard Kausler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-03 16:23:21

Jeśli zawijasz kod w pakiet, zawsze możesz odpytywać części katalogu pakietów.
Oto przykład z pakietu RGtk2:

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

Możesz zrobić to samo z katalogiem inst/glade/ w Twoich źródłach, który stanie się katalogiem glade/ w zainstalowanym pakiecie -- i system.file() obliczy ścieżkę dla ciebie po zainstalowaniu, niezależnie od systemu operacyjnego.

 4
Author: Dirk Eddelbuettel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-10 18:32:55

Ta odpowiedź działa mi dobrze:

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

Uwaga: skrypt musi być pozyskiwany, aby zwrócić poprawną ścieżkę

Znalazłem w: https://support.rstudio.com/hc/communities/public/questions/200895567-can-user-obtain-the-path-of-current-Project-s-directory-

Ale nadal nie rozumiem, co to jest sys.frame (1)$ofile. Nie znalazłem nic na ten temat w dokumentacji R. Ktoś może to wyjaśnić?

 3
Author: sietemonos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-25 22:28:59
#' 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
}
 1
Author: Jerry T,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-18 02:21:00

A co powiesz na użycie poleceń systemowych i powłokowych? W przypadku windows, myślę, że po otwarciu skryptu w RStudio ustawia bieżący katalog powłoki do katalogu skryptu. Być może będziesz musiał dodać cd C: \ e. G lub inny napęd, który chcesz wyszukać (np. shell ('dir C: \ \ *nazwa_pliku /s', intern = TRUE) - \ \ aby uciec znak ucieczki). DziaĹ 'a tylko dla plikĂłw o unikalnych nazwach, chyba Ĺźe okreĹ" lisz podkatalogăłw (dla Linuksa zaczÄ ™ Ĺ ' em szukaÄ ‡ od /). W każdym razie, jeśli wiesz, jak znajdź coś w powłoce, to zapewnia układ, aby znaleźć to w R i zwrócić katalog. Powinno działać niezależnie od tego, czy pozyskujesz lub uruchamiasz skrypt, ale nie zbadałem w pełni potencjalnych błędów.

#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)
 0
Author: WJ2016,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-08 10:51:15