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

2024-05-16 21:57:50 发布

您现在位置:Python中文网/ 问答频道 /正文

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

最好用一些代码来解释我的想法。这里我定义了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
print x
```
## 1

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

^{pr2}$

但这里看起来没有错误。如果我想在新的R chunck中使用x:

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

我得到一个错误。现在如果我尝试在新的R块中使用y,它会很好地工作。r引擎可以使用在前面的r chunck中定义的变量。注意,这不适用于python。在

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

为什么R和python在行为上有区别呢?它是由于R范围界定规则造成的,还是仅仅是一个尚未在knitr中实现的未来?或者是虫子?在


Tags: path语言定义选项错误fig特性width
2条回答

您可以在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
>>> 

下面是运行上述代码后的示例会话。在

^{pr2}$

您可以改用file/socket/message queue/etc

这是记录在案的行为。在

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

Except engine='R' (default), all chunks are executed in separate sessions, so the variables cannot be directly shared. If we want to make use of objects created in previous chunks, we usually have to write them to files (as side effects). For the bash engine, we can use Sys.setenv() to export variables from R to bash (example)

相关问题 更多 >