2015-05-11 6 views
4

Yihui дает пример использования опции кэширования для различных двигателейknitr - Python вариант кэша двигателя не работает

https://github.com/yihui/knitr-examples/blob/master/023-engine-python.Rmd

Я не могу показаться, чтобы заставить его работать на питон.

следующие работы

```{r,engine='python',cache=TRUE} 
x=10 
print x 
``` 

Но это не работает

```{r,engine='python',cache=TRUE} 
x = 10 
``` 

```{r,engine='python',cache=TRUE} 
print x 
``` 

Кто-нибудь есть идеи?

ответ

4

Параметр chunk cache не сохраняет все переменные, определенные в блоке, для языков, отличных от R. Это, тем не менее, сохранение печатных выходов, поэтому, если вы вычисляете что-то, что требуется некоторое время, любые результаты не нужно переучитывать. С knitr сайта:

engine='R' За исключением (по умолчанию), все куски выполнены в виде отдельных сессий, так что переменные не могут быть непосредственно разделены. Если мы хотим использовать объекты, созданные в предыдущих кусках, мы обычно должны записать их в файлы (в качестве побочных эффектов). Для двигателя bash мы можем использовать Sys.setenv() для экспорта переменных из R в bash (пример).

Можно сохранить несколько значений в среде оболочки и получить эти значения из других ячеек, прочитав среду. Это подход Yihui took in the Polyglot example. Итак, для Python, если вы можете отформатировать значение в виде строки и передать его в sys.setenv(), вы можете использовать это значение в другой ячейке (выполняемой как отдельный сеанс Python), вызывая sys.getenv().

Хотя, я слегка запутался в отношении подхода, предпринятого с двигателями C и Fortran. Кажется, что у них есть доступ к скомпилированным функциям в более поздних фрагментах: using some function called .C() или function called .Fortran(). Но похоже, что у Python нет эквивалента.