我尝试在Quarto文档中从Python调用R对象:
---
title: "pandas"
format: html
jupyter: python3
---
```{r}
data("penguins", package = "palmerpenguins")
```
```{python}
penguins=r.penguins
penguins
```
当我在RStudio中一个一个地执行块时,一切都没问题:
> data("penguins", package = "palmerpenguins")
> reticulate::repl_python() # automatically executed by RStudio
Python 3.10.4 (/Users/.../3.10.4/bin/python3.10)
Reticulate 1.24 REPL -- A Python interpreter in R.
Enter 'exit' or 'quit' to exit the REPL and return to R.
>>> penguins=r.penguins
>>> penguins
species island bill_length_mm ... body_mass_g sex year
0 Adelie Torgersen 39.1 ... 3750 male 2007
1 Adelie Torgersen 39.5 ... 3800 female 2007
...
然而,当我尝试呈现这个文档时,它会出错:
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Input In [1], in <cell line: 2>()
1 # Python chunk
----> 2 penguins=r.penguins
3 penguins
NameError: name 'r' is not defined
根据RMarkdown文档,不需要其他任何东西(因此不需要例如rpy2
)。
我尝试在R块中添加library(reticulate)
或reticulate::repl_python()
,但这并不能解决问题。
注意:我注意到RMarkdown有一个老的没有答案的类似问题。
谢谢!
Quarto有两个渲染引擎,knitr和jupyter。相关文件在此。
如果我们使用:
---
title: "pandas"
format: html
---
```{r}
data("penguins", package = "palmerpenguins")
```
```{python}
penguins=r.penguins
penguins
```
引擎将被编织。在渲染时,knitr将使用reticulate
(R接口到Python)来运行Python代码块。在这个过程中,knitr会做一些神奇的事情,把像r.penguins
这样的形式转换成reticulate
的形式。因此,文档将成功呈现。换句话说,knitr做了一些调整,让我们可以很容易地使用reticulate
来运行python代码块,如果我们不使用knitr引擎,我们就不能使用像r.penguins
这样的形式。
Quarto使用r运行所有代码块(自动使用r包
reticulate
运行python块)当它使用knitr引擎
和Quarto使用jupyter (jupyter: python3)引擎时使用python运行所有代码块。如果我们想运行r代码,我们必须在python块中使用module(如rpy2)(不是r块,r块中的代码将不会运行)。
我们也可以使用r通过设置
jupyter: ir
来运行所有的代码块(如果我们已经安装了IRkernel)。但是python块中的代码将不会运行。我们必须在r块中使用package(如reticulate)来运行python代码。
这是我的理解。我的英语不太好,所以如果有些句子让你困惑,我们可以进一步讨论。
我没有解释,但是在YAML中删除jupyter: python3
行解决了我的问题。