Language engines是一个很棒的knitr特性。我们可以在针织品中使用任何语言,包括但不限于R,但是如果我想使用在一种语言中定义的结果/变量,在另一种语言中使用另一种语言或者用另一种语言定义的结果/变量(更性感的选项)呢?
最好用代码来解释我的想法。这里我定义了4个块,2个在python中,2个在R中。
首先,我在python中定义了变量x:
## I define engien path explicitly here (TODO: set it globally)
```{r,engine='python',engine.path='C:/Anaconda/python.exe' }X=1
打印x
## 1现在,尝试在新的python chunck中使用x:
```{r,engine='python',engine.path='C:/Anaconda/python.exe' }X=x +1
打印x
没有错误,但惊人的结果,看起来x是空在这里。现在,如果我尝试在新的R chunck中使用x:
```{r fig.width=7, fig.height=6}X +1
Y=2
## Error: object 'x' not found 我犯了个错误。现在,如果我尝试在新的R块中使用y,它会很好。R引擎可以使用在前defined中定义的变量。注意,这不适用于python。
```{r fig.width=7, fig.height=6}y+3
## [1] 5为什么R和python在行为上有区别?这是由于R的范围界定规则的结构,还是仅仅是一个未来还没有实现的针织?或者是窃听器?
发布于 2013-08-01 00:20:14
这是记录在案的行为。
请参阅http://yihui.name/knitr/demo/engines/
除了engine='R‘(默认),所有块都在单独的会话中执行,因此变量不能直接共享。如果我们想要利用以前块中创建的对象,我们通常必须将它们写入文件(作为副作用)。对于bash引擎,我们可以使用Sys.setenv()将变量从R导出到bash (示例)
发布于 2013-08-15 07:41:51
您可以将某些内容放入python的启动(PYTHONSTARTUP)文件中。当利用atexit退出时,精心编写的启动文件可以导出文件中的所有已知变量。
下面是一个打印所有新的全局的菜谱:
>>> 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
>>> 下面是运行上述代码后的一个示例会话。
>>>
>>> def foo():
... a = 1
...
>>> b = 2
>>> ^D
b=2
foo=<function foo at 0x107140d70>您可以使用文件/套接字/消息队列/等等。
https://stackoverflow.com/questions/17982967
复制相似问题