web-dev-qa-db-fra.com

Commande R pour définir le répertoire de travail sur l'emplacement du fichier source dans Rstudio

Je travaille sur quelques tutoriels dans R. Chaque code R est contenu dans un dossier spécifique. Il y a des fichiers de données et d'autres fichiers. Je veux ouvrir le .r fichier et source de sorte que je n’ai pas à changer le répertoire de travail dans Rstudio comme indiqué ci-dessous:

enter image description here

Est-il possible de spécifier automatiquement mon répertoire de travail dans R.

111
Stat-R

Pour obtenir l'emplacement d'un script en cours de création, vous pouvez utiliser utils::getSrcDirectory ou utils::getSrcFilename. Vous pouvez donc changer le répertoire de travail pour celui du fichier actuel avec:

setwd(getSrcDirectory()[1])

Cela ne fonctionne pas dans RStudio si vous Run le code plutôt que Source ing. Pour cela, vous devez utiliser rstudioapi::getActiveDocumentContext.

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

Cette deuxième solution nécessite bien sûr que vous utilisiez RStudio comme votre IDE.

50
Richie Cotton

Je sais que cette question est obsolète, mais je cherchais une solution à ce problème également, et Google la mentionne tout en haut:

this.dir <- dirname(parent.frame(2)$ofile)
setwd(this.dir)

mettez cela quelque part dans le fichier (le mieux serait le début, cependant), de sorte que le wd soit modifié en fonction de ce fichier.

Selon les commentaires, cela ne fonctionnerait pas nécessairement sur toutes les plateformes (Windows semble fonctionner, Linux/Mac pour certaines). Gardez à l'esprit que cette solution est destinée à la "recherche" des fichiers, pas nécessairement à l'exécution de morceaux dans ce fichier.

voir aussi récupère le nom du fichier et le chemin du fichier `source`d

61
BumbleBee

Pour rstudio , vous pouvez automatiquement définir votre répertoire de travail sur le répertoire de script à l'aide de rstudioapi comme ceci:

library(rstudioapi)

# Getting the path of your current open file
current_path = rstudioapi::getActiveDocumentContext()$path 
setwd(dirname(current_path ))
print( getwd() )

Cela fonctionne lors de l'exécution ou de la source de votre fichier.

Vous devez d'abord installer le paquet rstudioapi. Notez que j'imprime le chemin pour être sûr à 100% que je suis au bon endroit, mais c'est facultatif.

6
gagarine

Cette réponse peut aider:

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

Remarque: le script doit être recherché pour renvoyer le chemin 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-

La réponse de BumbleBee (avec parent.frame à la place de sys.frame) ne m’a pas fonctionné, j’ai toujours une erreur.

6
sietemonos
dirname(rstudioapi::getActiveDocumentContext()$path)

fonctionne pour moi, mais si vous ne voulez pas utiliser rstudioapi et que vous n'êtes pas dans un projet, vous pouvez utiliser le symbole ~ dans votre chemin. Le symbole ~ fait référence au répertoire de travail RStudio par défaut (au moins sous Windows).

RStudio options

Si votre répertoire de travail RStudio est "D:/Documents", setwd("~/proyect1") est identique à setwd ("D:/Documents/proyect1").

Une fois que vous avez défini cela, vous pouvez accéder à un sous-répertoire: read.csv("DATA/mydata.csv"). Est identique à read.csv("D:/Documents/proyect1/DATA/mydata.csv").

Si vous souhaitez accéder à un dossier parent, vous pouvez utiliser "../". Par exemple: read.csv("../olddata/DATA/mydata.csv") qui est identique à read.csv("D:/Documents/oldata/DATA/mydata.csv")

C’est la meilleure façon pour moi de coder des scripts, quel que soit l’ordinateur que vous utilisez.

6
Juan Pueyo

La solution

dirname(parent.frame(2)$ofile)

ne travaille pas pour moi.

J'utilise un algorithme de force brute, mais fonctionne:

File <- "filename"
Files <- list.files(path=file.path("~"),recursive=T,include.dirs=T)
Path.file <- names(unlist(sapply(Files,grep,pattern=File))[1])
Dir.wd <- dirname(Path.file)

Plus facile lors de la recherche d'un répertoire:

Dirname <- "subdir_name"
Dirs <- list.dirs(path=file.path("~"),recursive=T)
dir_wd <- names(unlist(sapply(Dirs,grep,pattern=Dirname))[1])
5
namu.net

Je me rends compte que c’est un vieux fil de discussion, mais j’avais le même problème avec la nécessité de définir le répertoire de travail et je n’avais aucune des solutions à utiliser pour moi. Voici ce qui a fonctionné, au cas où quelqu'un tomberait plus tard dessus:

# SET WORKING DIRECTORY TO CURRENT DIRECTORY:
system("pwd=`pwd`; $pwd 2> dummyfile.txt")
dir <- fread("dummyfile.txt")
n<- colnames(dir)[2]
n2 <- substr(n, 1, nchar(n)-1)
setwd(n2)

C'est un peu compliqué, mais fondamentalement, cela utilise des commandes système pour obtenir le répertoire de travail et le sauvegarder dans dummyfile.txt, puis R lit ce fichier en utilisant data.table :: fread. Le reste ne fait que nettoyer ce qui a été imprimé dans le fichier, de sorte qu'il ne me reste que le chemin du répertoire.

J'avais besoin d'exécuter R sur un cluster, il n'y avait donc aucun moyen de savoir dans quel répertoire je me retrouverais (les tâches reçoivent un numéro et un nœud de calcul). Cela a fait le tour pour moi.

3
Katie Renwick

Je cherchais juste une solution à ce problème, est venu à cette page. Je sais que c'est daté, mais les solutions précédentes étaient insatisfaisantes ou ne fonctionnaient pas pour moi. Voici mon travail si intéressé.

filename = "your_file.R"
filepath = file.choose()  # browse and select your_file.R in the window
dir = substr(filepath, 1, nchar(filepath)-nchar(filename))
setwd(dir)
3
Ryan Liebert

Je comprends que cela est obsolète, mais je ne pouvais pas obtenir les réponses précédentes de manière très satisfaisante, aussi je voulais apporter ma méthode au cas où une autre personne rencontrerait la même erreur que celle mentionnée dans les commentaires de la réponse de BumbleBee.

Le mien est basé sur une commande système simple. Tout ce que vous alimentez est le nom de votre script:

extractRootDir <- function(x) {
    abs <- suppressWarnings(system(paste("find ./ -name",x), wait=T, intern=T, ignore.stderr=T))[1];
    path <- paste("~",substr(abs, 3, length(strsplit(abs,"")[[1]])),sep="");
    ret <- gsub(x, "", path);
    return(ret);
}

setwd(extractRootDir("myScript.R"));

La sortie de la fonction ressemblerait à "/Users/you/Path/To/Script". J'espère que cela aidera tous ceux qui sont bloqués.

2
Tgsmith61591

Si vous travaillez sous Linux, vous pouvez essayer ceci:

setwd(system("pwd", intern = T) )

Ça marche pour moi.

2
Taz

La plupart des interfaces graphiques supposent que, si vous vous trouvez dans un répertoire et que vous "ouvrez", double-cliquez sur ou essayez d'exécuter un fichier .R, le répertoire dans lequel il réside sera le répertoire de travail, sauf indication contraire. L'interface graphique Mac fournit une méthode pour modifier ce comportement par défaut, qui peut être modifié dans le panneau de démarrage des préférences que vous définissez dans une session en cours d'exécution et qui prend effet au prochain "démarrage". Vous devriez également regarder:

?Startup

La documentation de RStudio indique:

"Lorsqu'il est lancé via une association de fichiers, RStudio définit automatiquement le répertoire de travail sur le répertoire du fichier ouvert." La configuration par défaut est que RStudio soit enregistré en tant que gestionnaire pour les fichiers .R, bien qu'il soit également mentionné la possibilité de définir une "association" par défaut avec RStudio pour les extensions .Rdata et .R. Je ne saurais dire si le statut de "gestionnaire" et le statut "d'association" sont les mêmes sous Linux.

http://www.rstudio.com/ide/docs/using/workspaces

0
42-
dirname(parent.frame(2)$ofile)  

ne fonctionne pas pour moi non plus, mais ce qui suit (comme suggéré dans https://stackoverflow.com/a/35842176/992088 ) fonctionne pour moi dans Ubuntu 14.04

dirname(rstudioapi::getActiveDocumentContext()$path)
0
Lamothy

Si vous utilisez le codage UTF-8:

path <- rstudioapi::getActiveDocumentContext()$path
Encoding(path) <- "UTF-8"
setwd(dirname(path))

Vous devez installer le paquet rstudioapi si vous ne l’avez pas encore fait.

0
jormaga

Le package here fournit la fonction here(), qui renvoie le répertoire racine de votre projet en fonction de méthodes heuristiques.

Ce n’est pas la solution parfaite, car il ne trouve pas l’emplacement du script, mais cela suffit à certaines fins, j’ai donc pensé le mettre ici.

0
Will