2017-09-14 1 views
2

Je souhaite définir le répertoire de travail de mes scripts dans le répertoire parent du fichier.Définissez le répertoire de travail sur le dossier parent du fichier de script dans R

Ma structure de dossier est projet/code/test.r

Dans le script 'test.r', je l'ai écrit:

getwd() 
setwd(dirname(getwd())) 
print(getwd()) 

Cependant, le répertoire de travail dépendra de l'endroit où je la source de la script dans le terminal.

Dans le terminal, je lançais le script des de projet «dossiers et « projet/code » et a obtenu les résultats suivants:

~/Documents/project: Rscript code/test.R 
~/Documents/project 
~/Documents 

~/Documents/project/code: Rscript test.R 
~/Documents/project/code 
~/Documents/project 

Je voudrais une façon de trouver le répertoire dans lequel le fichier est situé.

Mes infos de session est ici:

> sessionInfo() 
R version 3.4.0 (2017-04-21) 
Platform: x86_64-apple-darwin16.5.0 (64-bit) 
Running under: macOS Sierra 10.12.6 

Matrix products: default 
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib 
LAPACK: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib 

locale: 
[1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] bindrcpp_0.2 dplyr_0.7.2 

loaded via a namespace (and not attached): 
[1] Biobase_2.36.2    jsonlite_1.5    
[3] bit64_0.9-7    splines_3.4.0    
[5] Formula_1.2-2    assertthat_0.2.0   
[7] stats4_3.4.0    latticeExtra_0.6-28  
[9] blob_1.1.0     GenomeInfoDbData_0.99.0 
[11] yaml_2.1.14    RSQLite_2.0    
[13] backports_1.1.0   lattice_0.20-35   
[15] glue_1.1.1     digest_0.6.12    
[17] GenomicRanges_1.28.4  RColorBrewer_1.1-2   
[19] XVector_0.16.0    checkmate_1.8.3   
[21] colorspace_1.3-2   htmltools_0.3.6   
[23] Matrix_1.2-10    plyr_1.8.4     
[25] DESeq2_1.16.1    XML_3.98-1.9    
[27] pkgconfig_2.0.1   pheatmap_1.0.8    
[29] genefilter_1.58.1   zlibbioc_1.22.0   
[31] purrr_0.2.3    xtable_1.8-2    
[33] scales_0.4.1    BiocParallel_1.10.1  
[35] htmlTable_1.9    tibble_1.3.3    
[37] annotate_1.54.0   IRanges_2.10.2    
[39] ggplot2_2.2.1    SummarizedExperiment_1.6.3 
[41] nnet_7.3-12    BiocGenerics_0.22.0  
[43] lazyeval_0.2.0    survival_2.41-3   
[45] magrittr_1.5    evaluate_0.10.1   
[47] memoise_1.1.0    foreign_0.8-69    
[49] tools_3.4.0    data.table_1.10.4   
[51] matrixStats_0.52.2   stringr_1.2.0    
[53] S4Vectors_0.14.3   munsell_0.4.3    
[55] locfit_1.5-9.1    cluster_2.0.6    
[57] DelayedArray_0.2.7   AnnotationDbi_1.38.2  
[59] compiler_3.4.0    GenomeInfoDb_1.12.2  
[61] rlang_0.1.2    grid_3.4.0     
[63] RCurl_1.95-4.8    rstudioapi_0.6    
[65] htmlwidgets_0.9   rmarkdown_1.6    
[67] bitops_1.0-6    base64enc_0.1-3   
[69] labeling_0.3    gtable_0.2.0    
[71] DBI_0.7     R6_2.2.2     
[73] gridExtra_2.2.1   knitr_1.17     
[75] bit_1.1-12     rprojroot_1.2    
[77] bindr_0.1     Hmisc_4.0-3    
[79] stringi_1.1.5    parallel_3.4.0    
[81] Rcpp_0.12.12    geneplotter_1.54.0   
[83] rpart_4.1-11    acepack_1.4.1 

Merci.

Best, C.

Répondre

1

J'ai essayé le dirname(parent.frame(2)$ofile) et dirname(sys.frame(2)$ofile) méthode, mais les deux ne fonctionnent pas très bien avec moi (je suis sur R 3.4.1, en utilisant rstudio et Windows 10). J'ai essayé de le trouver dans RStudio et R GUI. Aussi essayé de l'exécuter à partir de la ligne de commande.

Cette méthode ci-dessous à partir de l'utilisateur rakensi (https://stackoverflow.com/users/1021892/rakensi) fonctionne très bien pour moi. Les crédits vont à lui. Lien vers la réponse: Getting path of an R script.

Une autre méthode (test_v2.R) fonctionne pour moi en utilisant Rscript. Le crédit va à l'utilisateur steamer25 (https://stackoverflow.com/users/93345/steamer25) et le lien à la réponse (Rscript: Determine path of the executing script).

test.rExécuter ce en utilisant la source (test.r) dans rstudio

## Run this from ~/Documents/project/code or directory of your choice 
script.dir <- getSrcDirectory(function(x) {x}) 
print(script.dir) 
# gives you ~/Documents/project/code 
setwd(script.dir) 

test_v2.RExécuter ce en utilisant Rscript.exe

thisFile <- function() { 
    cmdArgs <- commandArgs(trailingOnly = FALSE) 
    needle <- "--file=" 
    match <- grep(needle, cmdArgs) 
    if (length(match) > 0) { 
     # Rscript 
     return(normalizePath(sub(needle, "", cmdArgs[match]))) 
    } else { 
     # 'source'd via R console 
     return(normalizePath(sys.frames()[[1]]$ofile)) 
    } 
} 
script.dir <- dirname(thisFile()) 
setwd(script.dir) 
print(getwd()) 
+0

Salut, malheureusement cela n'a pas fonctionné pour moi: ~/code: Rscript test.R caractère (0) Erreur dans setwd (script.dir): argument de caractère attendu Exécution interrompue – charlesdarwin

+1

@charlesdarwin comment avez-vous exécuté le script? Je voudrais source ce script dans RStudio pour obtenir le résultat attendu. L'exécutez-vous à partir de l'invite cmd (ou peut-être Terminal dans votre cas)? – addicted

+1

Si vous l'exécutez à partir de l'invite de commande (en utilisant Rscript.exe), j'ai probablement une autre solution qui fonctionne (veuillez voir ma modification dans ma réponse ci-dessus). Crédit à l'utilisateur steamer25 (https://stackoverflow.com/users/93345/steamer25). – addicted

2

Cela va changer le répertoire à l'emplacement du fichier source.

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

I utilisé ce code mais a l'erreur suivante: Erreur dans dirname (parent.frame (2) $ ofile): un argument de vecteur de caractère expe Exécution interrompue – charlesdarwin

+0

Et print (parent.frame (2) $ ofile) donne NULL. – charlesdarwin

+0

Ok, cela ne marcherait que si vous utilisiez ce fichier depuis un fichier dans 'projet'. Avez-vous rstudio? Si c'est le cas, cela devrait fonctionner: 'setwd (dirname (rstudioapi :: getActiveDocumentContext() $ path))'. –