2015-05-19 18 views
5

Sto usando knitr per creare un report markdown per alcuni comandi bash. Tuttavia, le mie operazioni comprendono cambiare una directory e la creazione di un file di lì, quindi sarebbe l'ideale se potevo usare cd nel mio file .RMD:knitr con bash: modifica directory di lavoro

make a directory 
```{r mkdir, engine='bash'} 
mkdir mytest 
``` 
cd into directory 
```{r cd, engine='bash'} 
cd mytest 
``` 
create file 
```{r create, engine='bash'} 
touch myfile 
``` 
check contents 
```{r ls, engine='bash'} 
ls 
``` 

Tuttavia, il file myfile viene creato nella directory da cui ho compila il documento con knit e non in mytest. Immagino che una nuova shell bash sia stata avviata per ogni chunk di codice.

Ho visto discussioni sull'impostazione di cwd in R (https://github.com/yihui/knitr/issues/277) ma non per bash.

C'è un modo per impostare una directory di lavoro per un chunk di codice?

+1

Hai preso un'occhiata a '$ set opts_knit (root.dir = "... ")' e 'setwd (" ...")'? – pfuhlert

+0

Sì, ma queste sono entrambe le funzioni R e non ho alcun codice R nei miei blocchi. Sto solo usando R per chiamare 'knit'. Quindi non vedo la possibilità di cambiare CWD tra i blocchi ... – user1981275

+2

Questo è un problema noto. Si prega di consultare l'ultimo paragrafo di http://yihui.name/knitr/demo/engines/ Vedere anche https://github.com/yihui/runr Non sono abbastanza sicuro se runr funziona ancora bene in termini di 'bash 'motore. –

risposta

0

È possibile utilizzare Rscript per eseguire un file .Rmd e includere qualsiasi "codice R" all'interno della riga di comando per mantenere intatti i blocchi di codice.

Rscript -e "library(knitr); opts_knit\$set(root.dir='~'); knit('test.Rmd')" è un comando di bash di esempio per eseguire il file test.Rmd di seguito. È possibile modificare root.dir in base alle proprie esigenze.

make directories 
```{r mkdir, engine='bash'} 
mkdir mytest 
mkdir mytest2 
``` 

create one file in the 1st dir 
```{r create, engine='bash'} 
cd mytest 
touch myfile 
``` 

create another file in the 2nd dir 
```{r create2, engine='bash'} 
cd mytest2 
touch myfile2 
``` 

check contents 
```{r ls, engine='bash'} 
ls mytest* 
``` 

L'output:

``` 
## mytest: 
## myfile 
## 
## mytest2: 
## myfile2 
``` 
+0

he root.dir impostato nelle opzioni qui non ha alcun effetto; la tua soluzione crea i file all'interno delle directory create perché 'cd' e' touch' si trovano nello stesso chunk di codice. – user1981275

+0

Vedo lo stesso problema che hai citato, @ user1981275. la dir non cambia mai, tutto rimane nella directory dei documenti. – pauljohn32