Ottenere il percorso di uno script R

C’è un modo per trovare a livello di programmazione il percorso di uno script R all’interno dello script stesso?

Lo sto chiedendo perché ho diversi script che usano RGtk2 e caricano una GUI da un file .glade.

In questi script sono obbligato a mettere setwd("path/to/the/script") all’inizio, altrimenti il ​​file .glade (che si trova nella stessa directory) non verrà trovato.

Questo va bene, ma se sposto lo script in una directory diversa o su un altro computer devo cambiare il percorso. Lo so, non è un grosso problema, ma sarebbe bello avere qualcosa come:

setwd(getScriptPath())

Quindi, esiste una funzione simile?

Usa source("yourfile.R", chdir = T)

Questo funziona per me:

 getSrcDirectory(function(x) {x}) 

Definisce una funzione anonima (che non fa nulla) all’interno dello script e quindi determina la directory di origine di tale funzione, che è la directory in cui si trova lo script.

Solo per RStudio:

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

Funziona quando Esegui o Sorgente il tuo file.

Sfruttare l’argomento implicito “–file” di Rscript

Quando si chiama lo script utilizzando “Rscript” ( Documento Rscript ), il percorso completo dello script viene fornito come parametro di sistema. La seguente funzione sfrutta questo per estrarre la directory degli script:

 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) } 

Se si avvolge il codice in un pacchetto, è sempre ansible interrogare parti della directory del pacchetto.
Ecco un esempio dal pacchetto RGtk2:

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

Puoi fare lo stesso con una directory inst/glade/ nelle tue fonti che diventerà una directory glade/ nel pacchetto installato – e system.file() calcolerà il percorso per te quando installato, indipendentemente dal sistema operativo.

Questa risposta funziona bene per me:

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

Nota: lo script deve essere fornito per restituire il percorso corretto

L'ho trovato in: https://support.rstudio.com/hc/communities/public/questions/200895567-can-user-obtain-the-path-of-current-Project-s-directory-

Ma ancora non capisco cosa sia sys.frame (1) $ ofile. Non ho trovato nulla a riguardo in R Documentation. Qualcuno può spiegarlo?

 #' 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 } 

Che ne dici di usare i comandi di sistema e di shell? Con Windows One, penso che quando apri lo script in RStudio, imposta la directory della shell corrente nella directory dello script. Potrebbe essere necessario aggiungere cd C: \ eg o qualsiasi altra unità che si desidera cercare (ad es. Shell (‘dir C: \\ * nome_file / s’, intern = TRUE) – \\ per uscire dal carattere di escape). Funzionerà solo con file con nome univoco a meno che non specifichi ulteriormente le sottodirectory (per Linux ho iniziato a cercare da /). In ogni caso, se sai come trovare qualcosa nella shell, questo fornisce un layout per trovarlo all’interno di R e restituire la directory. Dovrebbe funzionare se si sta acquistando o eseguendo lo script ma non ho esplorato completamente i potenziali bug.

 #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)