Obtenir le chemin d'un script R

y a-t-il un moyen de trouver programmatiquement le chemin d'un script R à l'intérieur du script lui-même?

je demande cela parce que j'ai plusieurs scripts qui utilisent RGtk2 et chargent une interface graphique à partir d'un .le fichier glade.

dans ces scripts je suis obligé de mettre une instruction setwd("path/to/the/script") au début, sinon le .le fichier glade (qui est dans le même répertoire) ne sera pas trouvé.

C'est bien, mais si je déplace le script dans un répertoire différent ou à un autre ordinateur je dois changer le chemin. Je sais, ce n'est pas grand chose, mais ce serait bien d'avoir quelque chose comme:

setwd(getScriptPath())

donc, existe-t-il une fonction similaire?

57
demandé sur nico 2010-08-10 22:17:32

8 réponses

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

21
répondu hadley 2016-02-18 09:06:45

ça marche pour moi:

getSrcDirectory(function(x) {x})

définit une fonction anonyme (qui ne fait rien) à l'intérieur du script, et détermine ensuite le répertoire source de cette fonction, qui est le répertoire où se trouve le script.

33
répondu rakensi 2015-05-18 15:00:27

pour RStudio uniquement:

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

cela fonctionne quand Run ning ou Source In votre fichier.

24
répondu Richie Cotton 2016-03-22 18:32:33

exploiter l'argument implicite "--file" de Rscript

lors de l'appel du script en utilisant "Rscript" ( Rscript doc ) le chemin complet du script est donné comme paramètre système. La fonction suivante l'exploite pour extraire le répertoire 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)
}
6
répondu Bernhard Kausler 2014-06-03 16:23:21

si vous enveloppez votre code dans un paquet, vous pouvez toujours interroger des parties du répertoire de paquets.

Voici un exemple du paquet RGtk2:

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

vous pouvez faire la même chose avec un répertoire inst/glade/ dans vos sources qui deviendra un répertoire glade/ dans le paquet installé -- et system.file() calculera le chemin pour vous une fois installé, indépendamment du système D'exploitation.

4
répondu Dirk Eddelbuettel 2010-08-10 18:32:55

Cette réponse, qui fonctionne bien pour moi:

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

Remarque: le script doit être d'origine afin de retourner chemin d'accès correct

Je l'ai trouvé dans: https://support.rstudio.com/hc/communities/public/questions/200895567-can-user-obtain-the-path-of-current-Project-s-directory -

mais je ne comprends toujours pas ce qui est sys.cadre(1)$ofile. Je n'ai rien trouvé à ce sujet dans la Documentation de R. Quelqu'un peut l'expliquer?

3
répondu sietemonos 2015-04-25 22:28:59
#' current script dir
#' @param
#' @return
#' @examples
#' works with source() or in RStudio Run selection
#' @export
z.csd <- function() {
    # /q/rscript-determine-path-of-the-executing-script-49514/"^(?:--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
répondu Jerry T 2016-03-18 02:21:00

comment utiliser les commandes système et shell? Avec celui de windows, je pense que lorsque vous ouvrez le script dans RStudio il définit le shell courant répertoire le répertoire du script. Vous pourriez avoir à ajouter cd C:\ E. g ou n'importe quel lecteur que vous voulez rechercher (par exemple shell('dir c:\\*file_name /s', intern = TRUE) - \\ pour échapper au caractère escape). Ne fonctionnera que pour les fichiers nommés de façon unique, sauf si vous spécifiez des sous-répertoires (Pour Linux, j'ai commencé à chercher à partir de /). En tout cas, si vous savez comment trouver quelque chose dans le shell, cela donne une mise en page pour le trouver au sein de la R et retour au répertoire. Devrait fonctionner que vous cherchiez ou exécutiez le script, mais je n'ai pas exploré complètement les bogues potentiels.

#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
répondu WJ2016 2017-07-08 10:51:15