2015-05-19 12 views
5

Używam knitr do tworzenia raportu o przecenach dla niektórych poleceń basha. Jednak moje operacje obejmują zmianę katalogu i stworzenie pliku tam, więc to byłoby idealne, jeśli mogę użyć cd w moim .Rmd pliku:knitr z bash: zmień katalog roboczy

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 
``` 

Jednak plik myfile jest tworzony w katalogu, z którego skompiluj dokument pod numerem knit, a nie pod mytest. Domyślam się, że nowa powłoka bash jest uruchamiana dla każdego fragmentu kodu.

Widziałem dyskusje na temat ustawienia cwd w R (https://github.com/yihui/knitr/issues/277), ale nie dla bash.

Czy istnieje sposób na ustawienie katalogu roboczego dla fragmentu kodu?

+1

Czy przyjrzeć 'opts_knit $ zestawu (root.dir = "... ")' i 'setwd (" ...")'? – pfuhlert

+0

Tak, ale są to obie funkcje R i nie mam żadnego kodu R w moich fragmentach. Używam tylko R, aby wywołać 'knit'. Tak więc nie widzę możliwości zmiany cwd między fragmentami ... – user1981275

+2

Jest to znany problem. Proszę zobaczyć ostatni akapit http://yihui.name/knitr/demo/engines/ Zobacz także https://github.com/yihui/runr Nie jestem całkiem pewien, czy runr nadal działa dobrze pod względem 'bash 'silnik. –

Odpowiedz

0

Możesz użyć Rscript, aby uruchomić plik .Rmd i dołączyć dowolny "kod R" w wierszu poleceń, aby zachować nienaruszone fragmenty kodu.

Rscript -e "library(knitr); opts_knit\$set(root.dir='~'); knit('test.Rmd')" to przykładowa komenda bash do uruchamiania pliku test.Rmd poniżej. Możesz zmienić root.dir, aby spełnić Twoje potrzeby.

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* 
``` 

Wyjście:

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

on root.dir ustawiony w opcjach tutaj nie ma żadnego efektu; twoje rozwiązanie tworzy pliki w utworzonych katalogach, ponieważ 'cd' i' touch' są w tym samym fragmencie kodu. – user1981275

+0

Widzę ten sam problem, o którym wspomniałeś, @ user1981275. katalog nigdy się nie zmienia, wszystko pozostaje w katalogu dokumentów. – pauljohn32