17

也许我遗漏了一些东西,但是如果以下代码是我的 Rmd 文件的内容

```{r}
library(reticulate)
use_virtualenv("r-reticulate")
py_available(TRUE)
```
```{python}
a = 7
print(a)
```
```{r}
py$a
```

当我编织文件时,最后一个块的输出是 7(如预期的那样)。另一方面,单击 Rstudio 中的 run all 按钮(或逐个运行块),NULL最后一个块的结果。

R 笔记本示例相比,似乎flights在 python 块中分配一些东西应该py$flights可用于 R,但情况似乎并非如此。

问题:

  1. 有没有办法从 R 访问在以前运行的 Python 块中创建的变量(不是针织)?如何将在 python 块中创建的变量“导出”到 R?
  2. 什么是了解当我单击 Rmarkdown 文件的 python 块中的运行按钮时会发生什么的好参考?

编辑:好的,所以在这里看到第一个答案后,我确实将 knitr 和 rmarkdown 都更新到了最新版本,但仍然遇到同样的问题。我添加py_available(TRUE)到我的文件中以确保它已初始化,仍然是最后一个块在7编织时产生,但是一个接一个地运行块会导致

> py$a
Error in py_get_attr_impl(x, name, silent) : 
  AttributeError: 'module' object has no attribute 'a'

问题是:在 python 块中分配一个值在 R 环境中a没有做任何事情。py$a也许 R 和 python 之间的这种“共享”环境不是包应该如何工作的?此外,对于一些额外的信息

> py_config()
python:         /usr/bin/python
libpython:      /usr/lib/python2.7/config-x86_64-linux-gnu/libpython2.7.so
pythonhome:     /usr:/usr
version:        2.7.14 (default, Sep 23 2017, 22:06:14)  [GCC 7.2.0]
numpy:          /usr/lib/python2.7/dist-packages/numpy
numpy_version:  1.12.1

python versions found: 
 /usr/bin/python
 /usr/bin/python3
4

3 回答 3

10

Rmarkdown / knitr:

运行块:

到目前为止,不支持在不编织文档的情况下运行块。请参阅此处:https ://github.com/yihui/knitr/issues/1440或RMarkdown 中的 R/Python 单元或 Python/Python 单元之间不共享状态的网状体

编辑:Freguglia 的解决方法:

“解决方法是将 python 块转换为 R 块,并将整个内容包装在 py_run_string() 函数中,因此您在该段代码中分配的任何内容都可以通过 py$variable_name 从 R 访问。”

编织文件:

一种方法是按照上面的建议进行升级knitr,但您不必也不需要 RStudio 每日构建。

如果你有 1.18 之前的 knitr 版本,你可以包括:

```{r setup, include = FALSE} knitr::knit_engines$set(python = reticulate::eng_python) ``` ,请参见此处:https ://rstudio.github.io/reticulate/articles/r_markdown.html#engine-setup 。

Python:

如果它不起作用,请确保 python 连接在 rmarmdown/knitr: 之外运行 py_run_string("x = 10"); py$x

如果这也不起作用,您应该检查: py_available()py_numpy_available().

如果它返回FALSE: 尝试初始化它: py_available(TRUE)

如果这仍然是一个不 - 检查你的配置: py_config()

它将为您提供有关该问题的进一步提示:

对我来说的例子是:R 和 python 的不同位版本(32 vs 64)或者我在安装 Python2.7 和单独的 Anaconda 时遇到了麻烦。

于 2018-03-29T12:25:13.770 回答
5

这在当前的 RStudio Desktop 中已修复,例如1.2.1114. 但是,如果您像我一样坚持使用 RStudio Server Pro 1.1.456,比使用更好的解决方法py_run_string可能是使用reticulate::repl_python()它在 R 控制台中为您提供一个 Python 控制台,并允许您通过将它们复制粘贴到控制台来运行您的 Python 块。

解决方法: 解决方法 工作: 在职的

于 2019-02-05T19:23:48.470 回答
5

您必须使用 Rstudio 每日构建(源代码knitr)并升级rmarkdown到最新版本。

> packageVersion("rmarkdown")
[1] ‘1.9’
> packageVersion("knitr")
[1] ‘1.20’
于 2018-03-29T04:09:44.197 回答