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

abi*_*hat 3 python r r-markdown reticulate quarto

我尝试在 Quarto 文档中从 Python 调用 R 对象:

---
title: "pandas"
format: html
jupyter: python3
---

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

```{python}
penguins=r.penguins
penguins
```
Run Code Online (Sandbox Code Playgroud)

当我在 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
...
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试渲染此文档时,出现以下错误:

---------------------------------------------------------------------------
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
Run Code Online (Sandbox Code Playgroud)

根据RMarkdown 文档,不需要其他任何东西(所以不需要例如rpy2)。

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

注意:我知道RMarkdown有一个未解答的类似问题。

谢谢!

Gle*_* Ma 6

Quarto 有两个渲染引擎,knitr 和 jupyter。相关文档在这里

如果我们使用:

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

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

```{python}
penguins=r.penguins
penguins
```
Run Code Online (Sandbox Code Playgroud)

发动机将被编织。在渲染时,knitr 将使用reticulate(R Interface to Python)来运行 python 代码块。在这个过程中,knitr 会做一些神奇的事情,将 like 的形式转换r.penguins为 的形式reticulate。这样文档就可以成功渲染了。换句话说,knitr 做了一些调整,让我们可以轻松地用 运行 python 代码块reticulate,如果我们不使用 knit 引擎,我们就不能使用像 这样的形式r.penguins

当使用 knit 引擎时,Quarto 使用 r 运行所有代码块(自动使用 r 包reticulate运行 python 块)。

而Quarto在使用jupyter(jupyter:python3)引擎时使用python来运行所有代码块。如果我们想要运行r代码,我们必须使用python chunk中的模块(例如rpy2)(不是r chunk,r chunk中的代码将不会运行)。

我们还可以通过设置jupyter: ir(如果我们安装了IRkernel)使用r来运行所有代码块。但是python chunk中的代码将不会运行。我们必须在r chunk中使用package(例如reticulate)来运行python代码。

这是我的理解。我的英语不好,所以如果有些句子让你感到困惑,我们可以进一步讨论。