使用 r 从 Python 调用 R 对象。在四开本文档中

Call R object from Python with r. in a Quarto document

我尝试从 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 documentation,没有其他要求(因此不需要 rpy2)。

我尝试在 R 块中添加 library(reticulate)reticulate::repl_python() 但它没有解决问题。

注意:我知道 old unanswered similar question 用于 RMarkdown。

谢谢!

我没有任何解释,但是删除 YAML 中的行 jupyter: python3 解决了我的问题。

Quarto 有两个渲染引擎,knitr 和 jupyter.A 相关文档是 here

如果我们使用:

---
title: "pandas"
format: html
---

```{r}
data("penguins", package = "palmerpenguins")
```

```{python}
penguins=r.penguins
penguins
```

引擎将是 knitr。在渲染时,knitr 将使用 reticulate(R Interface to Python)到 运行 python 代码块。在这个过程中,knitr会做一些神奇的事情,将r.penguins这样的形式转换成reticulate的形式。所以文档将被成功呈现。换句话说,knitr 做了一些适配,让我们可以很容易地 运行 python code chunk 和 reticulate,如果我们不使用 knitr 引擎,我们就不能使用像这样的形式r.penguins.

Quarto use r run all code chunks (auto use r package reticulate to run python chunks) when it uses knitr engine.

And Quarto use python to run all code chunks when it uses jupyter (jupyter: python3) engine. If we want run r code, we must use module (such as rpy2) in python chunk (not r chunk, codes in r chunk will not be run).

We can also use r to run all code chunks by setting jupyter: ir (if we have installed IRkernel).But codes in python chunk will not be run. We must use package (such as reticulate) in r chunk to run python code.

这是我的理解。我的英文不好,所以如果有什么句子让你不解,我们可以进一步讨论。