在不同语言中定义的knitr中的块之间混合变量/结果?

ags*_*udy 7 python r knitr

Language engines是一个很棒的knitr功能.我们可以在knitr中使用任何语言,包括但不限于R. 但是,如果我想使用在一个chunck中定义的结果/变量,在另一个chunck中使用相同的语言或另一种语言(更性感的选项)怎么办?

最好用一些代码来解释我的想法.在这里,我定义了4个块,2个在python中,2个在R中.

首先我x在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
Run Code Online (Sandbox Code Playgroud)

现在尝试在新的python chunck中使用x:

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

```
Run Code Online (Sandbox Code Playgroud)

没有错误,但令人惊讶的结果,看起来像这里的x是NULL.现在,如果我尝试在新的R chunck中使用x:

```{r fig.width=7, fig.height=6}
x +1
y = 2
```
## Error: object 'x' not found 
Run Code Online (Sandbox Code Playgroud)

我收到一个错误.现在如果我尝试在新的R块中使用y并且它工作正常.r引擎可以使用前一个R chunck中定义的变量.注意这不适用于python.

```{r fig.width=7, fig.height=6}
y+3
```
## [1] 5
Run Code Online (Sandbox Code Playgroud)

为什么R和python之间的行为存在差异?它是结构性的,因为R的范围规则还是仅仅是knitr中尚未实现的未来?或者也许是一个bug?

mne*_*nel 8

这是记录在案的行为.

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

除了engine ='R'(默认),所有块都在不同的会话中执行,因此无法直接共享变量.如果我们想要使用在先前块中创建的对象,我们通常必须将它们写入文件(作为副作用).对于bash引擎,我们可以使用Sys.setenv()将变量从R导出到bash(示例)

  • @agstudy女士们,先生们,目前的发动机设计远非令人满意,我肯定需要帮助:https://github.com/yihui/runr我[让朱莉娅在knitr工作](https://groups.google.com/forum /#!topic/knitr/F78PBMIamwk),我猜Python应该比Julia更容易融入R?基本思想是通过套接字或fifo进行通信.非常欢迎您成为这个包的共同作者. (4认同)