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

135

Je travaille sur des tutoriels en R. Chaque code R est contenu dans un dossier spécifique. Il y a des fichiers de données et d'autres fichiers là-dedans. Je veux ouvrir le .rfichier et le créer de manière à ne pas avoir à changer le répertoire de travail dans Rstudio comme indiqué ci-dessous:

entrez la description de l'image ici

Existe-t-il un moyen de spécifier automatiquement mon répertoire de travail dans R.

Stat-R
la source
C'est probablement une dupe. voir?setwd ?getwd
Brandon Bertelsen
3
Pas une dupe, l'affiche veut loaddes fichiers .rdata dans le même dossier, pas sourceavec le répertoire de travail défini sur le chemin du fichier source.
Ruben

Réponses:

76

Pour obtenir l'emplacement d'un script source, vous pouvez utiliser utils::getSrcDirectoryou utils::getSrcFilename. Ainsi, le changement du répertoire de travail vers celui du fichier courant peut être fait avec:

setwd(getSrcDirectory()[1])

Cela ne fonctionne pas dans RStudio si vous exécutez le code plutôt que le source . Pour cela, vous devez utiliser rstudioapi::getActiveDocumentContext.

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

Cette seconde solution nécessite que vous utilisiez RStudio comme IDE, bien sûr.

Coton Richie
la source
votre propre réponse à stackoverflow.com/a/35842176/1247080 fonctionne (il faut cependant inclure le dirname). Je l'ai ajouté
Stat-R
Ça ne marche pas pour moi. Je reçoisError: 'getActiveDocumentContext' is not an exported object from 'namespace:rstudioapi'
Andru
2
Notez que lorsque vous exécutez getActiveDocumentContext()dans la console dans RStudio, le chemin est signalé comme ''. Cependant, si vous exécutez la ligne de code dans la partie éditeur, elle s'exécutera comme prévu. Cela peut répondre au commentaire de @Andru
Megatron
1
@giac_man Il semble que vous utilisiez une très ancienne version du rstudioapipaquet. Essayez de passer à la dernière version.
Richie Cotton
1
@mjs En haut de la console, vous devriez voir le répertoire de travail actuel. À droite de cela se trouve une petite flèche. Cliquez dessus pour afficher le répertoire de travail actuel dans le navigateur de fichiers.
Richie Cotton
62

Je sais que cette question est obsolète, mais je cherchais également une solution pour cela et Google la répertorie 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 pourrait ne pas nécessairement fonctionner sur toutes les plates-formes (Windows semble fonctionner, Linux / Mac pour certains). Gardez à l'esprit que cette solution est pour «sourcer» les fichiers, pas nécessairement pour exécuter des morceaux dans ce fichier.

voir aussi obtenir le nom du fichier et le chemin du fichier `source`d

Bourdon
la source
99
n'a pas fonctionné pour moi non plus:Error in dirname(parent.frame(2)$ofile) : a character vector argument expected
tumultous_rooster
4
Même problème ici que @Matt O'Brien sous Linux.
patapouf_ai
3
Fonctionne parfaitement si source.
m-dz le
2
A travaillé pour moi dans RStudio v1.0.143 sur Windows 10. Si vous sélectionnez "Source on save", cela fonctionnera très bien (vous pouvez imprimer le répertoire détecté avec "cat"). Si vous sélectionnez les lignes puis exécutez-les, le résultat est nul.
Contango
2
Cela fonctionne pour moi sur un Mac lors de la recherche d'un fichier. Cependant, comme @Contango l'a souligné ci-dessus, cela ne fonctionnera pas lors de l'exécution du code de manière interactive en mettant en surbrillance un morceau et en appuyant sur Commande + Retour. Dans ce cas, puisque vous n'approvisionnez pas un fichier, il n'y a pas de fichier source à partir duquel extraire le répertoire de travail. La réponse n'a pas besoin de spécifier des mises en garde spécifiques à la plate-forme.
bmosov01
7
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 par défaut de RStudio (au moins sous Windows).

Options de RStudio

Si votre répertoire de travail RStudio est "D: / Documents", setwd("~/proyect1")est le même que setwd ("D: / Documents / proyect1").

Une fois que vous définissez, vous pouvez accéder à un sous - répertoire: read.csv("DATA/mydata.csv"). Est le même que 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 le même queread.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.

Juan Pueyo
la source
6

Pour rstudio , vous pouvez définir automatiquement votre répertoire de travail sur le répertoire de script en utilisant rstudioapi comme ça:

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 package rstudioapi. Notez que j'imprime le chemin pour être sûr à 100% d'être au bon endroit, mais cela est facultatif.

gagarine
la source
Erreur dans setwd (dirname (current_path)): impossible de changer de répertoire de travail
tavalendo
@helmo vérifie que votre utilisateur dispose des droits d'écriture sur le répertoire cible.
gagarine
5

La solution

dirname(parent.frame(2)$ofile)

ne fonctionne 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 dans un répertoire:

Dirname <- "subdir_name"
Dirs <- list.dirs(path=file.path("~"),recursive=T)
dir_wd <- names(unlist(sapply(Dirs,grep,pattern=Dirname))[1])
namu.net
la source
1
Le problème avec cette solution est qu'elle est très lente. La recherche de tous les fichiers et leur stockage dans une variable consomment également beaucoup de mémoire.
tavalendo
4

Si vous travaillez sous Linux, vous pouvez essayer ceci:

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

Ça marche pour moi.

Taz
la source
1
Cela donne simplement votre répertoire personnel (où commence votre shell).
Caner
Il donne le chemin du répertoire où se trouve le script que vous exécutez.
Taz
2
pwd signifie répertoire de travail actuel. Cela définira le répertoire quel que soit le répertoire actuel du shell.
PeterVermont
pwdfonctionne également dans PowerShell (qui est actuellement considéré comme le shell par défaut sous Windows), où il s'agit d'un alias pour Get-Location.
BroVic
3

Je cherchais juste une solution à ce problème, je suis venu sur 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 vous êtes 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)
Ryan Liebert
la source
Y a-t-il une raison pour laquelle vous ne vous contentez pas d'utiliser setwd( dirname(filepath) )?
jodis
3

Je me rends compte qu'il s'agit d'un ancien fil de discussion, mais j'ai eu un problème similaire avec la nécessité de définir le répertoire de travail et je n'ai pas réussi à faire fonctionner les solutions pour moi. Voici ce qui a fonctionné, au cas où quelqu'un d'autre tomberait dessus plus tard:

# 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 l'enregistrer dans dummyfile.txt, puis R lit ce fichier en utilisant data.table :: fread. Le reste consiste simplement à nettoyer ce qui a été imprimé dans le fichier afin de ne me retrouver qu'avec 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 travaux se voient attribuer un numéro et un nœud de calcul). Cela a fait l'affaire pour moi.

Katie Renwick
la source
2

Je comprends que cela est obsolète, mais je ne pouvais pas faire fonctionner les premières réponses de manière très satisfaisante, donc je voulais contribuer ma méthode au cas où quelqu'un d'autre rencontrerait la même erreur que celle mentionnée dans les commentaires de la réponse de BumbleBee.

Le mien est basé sur une simple commande système. Tout ce que vous alimentez la fonction 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 toute autre personne qui pourrait être coincée.

Tgsmith61591
la source
1

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

Ce n'est pas la solution parfaite, car elle ne trouve pas l'emplacement du script, mais cela suffit à certaines fins, alors j'ai pensé que je la mettrais ici.

Volonté
la source
1
Merci pour cette réponse. L'emplacement du script actuel peut être exploité en plaçant un appel à here::set_here()dans la source.
BroVic
0

La plupart des interfaces graphiques supposent que si vous êtes dans un répertoire et que vous «ouvrez», double-cliquez ou tentez d'exécuter un fichier .R, que 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 changer ce comportement par défaut qui est modifiable dans le panneau de démarrage des préférences que vous définissez dans une session en cours et qui devient effective au prochain "démarrage". Vous devriez également regarder:

?Startup

La documentation RStudio dit:

"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é comme gestionnaire de 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. Si le statut du «gestionnaire» et celui de «l'association» sont les mêmes sous Linux, je ne peux pas le dire.

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

IRTFM
la source
4
Bien sûr, RStudio ne fait pas cette hypothèse.
nico
1
Il se comporte comme je l'ai décrit sur ma machine. Je n'ai rien fait de spécial pour les préférences de RStudio.
IRTFM
2
Ne fait pas ça sous Linux :)
nico
2
"Lorsqu'il est lancé via une association de fichiers" est la condition clé ici. Certaines personnes peuvent lancer Rstudio via un raccourci ou une commande dans le terminal. Vous devez ouvrir le fichier et que la valeur par défaut pour ouvrir les fichiers .R soit Rstudio. Si vous ouvrez d'abord Rstudio (puis ouvrez le fichier), cela ne fonctionnera pas comme décrit. Grâce à une association de fichiers, la réponse ci-dessus fonctionne dans Windows et Mac (peut-être pas sous Linux comme le souligne @nico - mais je ne peux pas le vérifier car je n'ai pas de machine Linux).
WetlabStudent
0
dirname(parent.frame(2)$ofile)  

ne fonctionne pas non plus pour moi, 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)
Lamothy
la source
1
Error: 'getActiveDocumentContext' is not an exported object from 'namespace:rstudioapi'également dans Ubuntu 14.04
Rich Scriven
Vous pouvez peut-être essayer d'installer d'abord le package rstudioapi.
Lamothy
C'est étrange. J'utilise R-3.2.4 dans un ubuntu 14.04 32 bits. J'espère que ce n'est pas à cause du système d'exploitation ou des différentes versions de R.
Lamothy
0

Si vous utilisez le codage UTF-8:

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

Vous devez installer le package rstudioapi si vous ne l'avez pas encore fait.

Jormaga
la source
Erreur dans setwd (dirname (chemin)): impossible de changer de répertoire de travail
tavalendo
`` Erreur dans setwd (dirname (chemin)): impossible de changer de répertoire de travail`` votre solution ne fonctionne pas s'il vous plaît vérifier votre réponse
Mr S Coder le
0

Voici une autre façon de le faire:

set2 <- function(name=NULL) {
  wd <- rstudioapi::getSourceEditorContext()$path
  if (!is.null(name)) {
    if (substr(name, nchar(name) - 1, nchar(name)) != '.R') 
      name <- paste0(name, '.R')
  }
  else {
    name <- stringr::word(wd, -1, sep='/')
  }
  wd <- gsub(wd, pattern=paste0('/', name), replacement = '')
  no_print <- eval(expr=setwd(wd), envir = .GlobalEnv)
}
set2()
Issam
la source