2013-07-31 11 views
7

Language engines to świetna funkcja knitr. Możemy używać dowolnych języków w dzierżawie, w tym między innymi R. Ale co jeśli chcę użyć wyników/zmiennych zdefiniowanych w jednym chunck, w innym chunck albo w tym samym języku lub w innym języku (bardziej sexy opcja)?miksować zmienne/wyniki pomiędzy fragmentami w knitr zdefiniowanymi w różnych językach?

Lepiej wyjaśnić mój pomysł za pomocą kodu. Tutaj definiuję 4 porcje, 2 w python i 2 w R.

Najpierw zdefiniować zmienną x w Pythonie:

## I define engien path explicitly here (TODO: set it globally) 
```{r,engine='python',engine.path='C:/Anaconda/python.exe' } 
x = 1 
print x 
``` 
## 1 

Teraz Spróbuj użyć X w nowym python chunck:

```{r,engine='python',engine.path='C:/Anaconda/python.exe' } 
x = x +1 
print x 

``` 

Brak błędu ale niesamowity wynik, wygląda jak x jest NULL tutaj. Teraz jeśli spróbuję użyć x w nowym R chunck:

```{r fig.width=7, fig.height=6} 
x +1 
y = 2 
``` 
## Error: object 'x' not found 

Wystąpił błąd. Teraz jeśli spróbuję użyć y w nowej porcji R i działa dobrze. silnik r może używać zmiennej zdefiniowanej w poprzednim R chunck. Uwaga: to nie działa z pythonem.

```{r fig.width=7, fig.height=6} 
y+3 
``` 
## [1] 5 

Dlaczego występuje różnica w zachowaniu między R i Pythonem? Czy jest to strukturalne ze względu na reguły ustalania R lub tylko przyszłość, która nie została jeszcze zaimplementowana w knitr? a może błąd?

Odpowiedz

8

To jest udokumentowane zachowanie.

zobaczyć http://yihui.name/knitr/demo/engines/

wyjątkiem silnika = „R” (domyślnie), wszystkie kawałki są wykonywane w oddzielnych sesji, więc zmienne nie mogą być bezpośrednio udostępnione. Jeśli chcemy, aby używali obiektów utworzonych w poprzednich porcjach, zazwyczaj musimy je zapisać w plikach jako efekty uboczne ( ). Dla silnika bash, możemy użyć Sys.setenv(), aby wyeksportować zmienne od R do bash (przykład)

+4

@agstudy Panie i panowie, obecna konstrukcja silnika jest daleki od zadowalającego, a ja na pewno potrzebujesz pomocy: https: // github. com/yihui/runr Mam [mam Julię pracującą w dziale] (https://groups.google.com/forum/#!topic/knitr/F78PBMIamwk), i domyślam się, że Python powinien być łatwiejszy niż Julia do włączenia do R ? Podstawową ideą jest komunikowanie się przez gniazda lub fifo. Serdecznie zapraszamy do współautora tego pakietu. –

1

Można umieścić coś na starcie (PYTHONSTARTUP) plik dla Pythona. Rozbudowany plik startowy może wyeksportować wszystkie znane zmienne w pliku przy wychodzeniu z obsługi atexit.

Oto przepis, który wypisuje wszystkie nowe globalnych:

>>> import atexit 
>>> def list_globals(known_globals=globals().keys()): 
...  new_globals = set(globals().keys()) 
...  new_globals -= set(known_globals) 
...  for key in new_globals: 
...  print '%s=%s' % (key, globals()[key]) 
... 
>>> atexit.register(list_globals) 
<function list_globals at 0x107140e60> 
>>> del list_globals 
>>> del atexit 
>>> 

Oto przykład sesja po powyższy kod został uruchomiony.

>>> 
>>> def foo(): 
... a = 1 
... 
>>> b = 2 
>>> ^D 
b=2 
foo=<function foo at 0x107140d70> 

Można zamiast używać plików/gniazda/wiadomość kolejkę/itp

Powiązane problemy