2013-07-31 7 views
7

Language engines è una grande funzionalità knitr. Possiamo usare qualsiasi lingua in knitr, incluso ma non limitato a R. Ma cosa succede se voglio usare i risultati/variabile definiti in un chunck, in un altro chunck con la stessa lingua o in un'altra lingua (opzione più sexy)?mescola variabili/risultati tra blocchi in knitr definiti in diverse lingue?

Meglio spiegare la mia idea con un po 'di codice. Qui definisco 4 blocchi, 2 in python e 2 in R.

prima cosa definire una variabile x in python:

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

Ora provate a usare x nella nuova chunck pitone:

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

``` 

Nessun errore, ma risultato sorprendente, sembra x è NULL qui. Ora se provo a usare x in un nuovo chunck R:

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

Ho un errore. Ora se provo a usare y nel nuovo chunk R e funziona bene. il motore r può usare la variabile definita nel precedente chunck R. Nota che questo non funziona con Python.

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

Perché c'è una differenza di comportamento tra R e Python qui? È strutturale a causa delle regole di scoping R o solo di un futuro non ancora implementato in knitr? o forse un bug?

risposta

8

Questo è il comportamento documentato.

vedere http://yihui.name/knitr/demo/engines/

Ad eccezione del motore = 'R' (default), tutti i pezzi sono eseguite in sessioni separate, in modo che le variabili non possono essere condivisi direttamente. Se vogliamo usare facendo uso di oggetti creati in blocchi precedenti, di solito dobbiamo scrivere su file (come effetti collaterali) su file . Per il motore bash, possiamo usare Sys.setenv() per esportare le variabili da R a bash (esempio)

+4

Signore @agstudy e signori, la progettazione del motore attuale è lungi dall'essere soddisfacente e ho sicuramente bisogno di aiuto: https: // GitHub. com/yihui/runr Ho [ottenuto che Julia lavori in knitr] (https://groups.google.com/forum/#!topic/knitr/F78PBMIamwk), e immagino che Python dovrebbe essere più facile di Julia per essere incorporato in R ? L'idea di base è comunicare tramite prese o fifo. Sei il benvenuto per essere co-autore di questo pacchetto. –

1

Si potrebbe mettere qualcosa in una startup (PYTHONSTARTUP) istanza di pitone. Un file di avvio elaborato può esportare tutte le variabili conosciute in un file quando si esce sfruttando lo atexit.

Ecco una ricetta che consente di stampare tutti i nuovi globali:

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

Ecco una sessione di esempio dopo che il codice di cui sopra è stato eseguito.

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

Si potrebbe invece utilizzare una coda di file/presa/messaggio/ecc

Problemi correlati