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

3
我正在尝试在 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的。
谢谢!

1
我没有使用Quarto,但是在将penguins替换为mtcars后运行了您的代码(保存为test-reticulate.Rmd),并且渲染时没有收到任何错误消息。我使用以下代码来渲染文档:library(rmarkdown); render("test-reticulate.Rmd")。我的平台分别来自于sessionInfo()sys.version。R:R version 4.1.3 (2022-03-10),Platform: x86_64-conda-linux-gnu (64-bit),Running under: Amazon Linux AMI 2018.03;Python:'3.10.4 | packaged by conda-forge | (main, Mar 24 2022, 17:51:59) [GCC 10.3.0]'。 R包版本:reticulate_1.24 rmarkdown_2.13 - mastropi
感谢您的尝试,我找到了一个“诀窍”使它起作用。 - abichat
2个回答

5

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

如果我们使用:

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

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

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

引擎将使用knitr。在渲染时,knitr将使用{{link1:reticulate}}(R接口到Python)来运行python代码块。在此过程中,knitr将进行一些魔术操作,将形式如r.penguins的形式转换为reticulate的形式。因此,文档将成功呈现。换句话说,knitr进行了一些适应性调整,使我们能够轻松地使用reticulate运行python代码块,如果不使用knitr引擎,则无法使用r.penguins等形式。
Quarto使用knitr引擎时,使用r运行所有代码块(自动使用r包reticulate运行python代码块)。
当使用jupyter(jupyter:python3)引擎时,Quarto使用python运行所有代码块。如果我们想运行r代码,则必须在python代码块中使用模块(例如rpy2),而不是r代码块,r代码将不会被运行。

如果我们安装了IRkernel,我们也可以使用r来运行所有代码块,只需设置jupyter: ir。但是python块中的代码将不会被运行。我们必须在r块中使用包(如reticulate)来运行python代码。

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


谢谢您解释这个行为 :) - abichat

0
我没有解释,但在 YAML 中删除 jupyter: python3 这行代码解决了我的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接