根据:https://yihui.name/knitr/demo/engines/许多语言由Rmarkdown处理。
然而,我注意到只有R! chunk似乎从以前的块中继承了变量。
例如,关注.Rmd文件:
---
title: "Variables inheritance in next chunk"
output: pdf_document
---
## Set variable
```{r defineVector}
w = as.vector(c(2,6,7,5,7,8,5,7,6))
```
## Print mean
```{r meanValue, echo=TRUE}
mean(w)
```
汇编得很好:
但Python的完全对应(Python块而不是R块):
---
title: "Variables inheritance in next chunk"
output: pdf_document
---
## Set variable
```{python defineVector}
w=[2,6,7,5,7,8,5,7,6]
```
## Print mean
```{python meanValue, echo=TRUE}
# Following line results in: <module> NameError: name 'w' is not defined
print(sum(w) / float(len(w)))
# However if I repeat line: w=[2,6,7,5,7,8,5,7,6]
# before print, document works - compiles to PDF
```
给出错误(NameError:名称'w'未定义):
是否有任何选项可以将所有块设置为对所有语言都采用完全相同的方式?
答案 0 :(得分:2)
答案实际上在OP提供的链接中:https://yihui.name/knitr/demo/engines/(我的重点)
除了engine ='R'(默认),所有块都在不同的会话中执行,因此无法直接共享变量。如果我们想要使用在先前块中创建的对象,我们通常必须将它们写入文件(作为副作用)。对于bash引擎,我们可以使用Sys.setenv()将变量从R导出到bash(示例)。另一种方法是使用(实验性)runr包。
以下是runr package的插图。