使用 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.
这是我的理解。我的英文不好,所以如果有什么句子让你不解,我们可以进一步讨论。
我尝试从 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.
这是我的理解。我的英文不好,所以如果有什么句子让你不解,我们可以进一步讨论。