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?
这是记录在案的行为.
见http://yihui.name/knitr/demo/engines/
除了engine ='R'(默认),所有块都在不同的会话中执行,因此无法直接共享变量.如果我们想要使用在先前块中创建的对象,我们通常必须将它们写入文件(作为副作用).对于bash引擎,我们可以使用Sys.setenv()将变量从R导出到bash(示例)
| 归档时间: |
|
| 查看次数: |
1460 次 |
| 最近记录: |