在Quarto文档中使用R从Python调用R对象



我尝试在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行解决了我的问题。

最新更新