【问题标题】:Reticulate - Running python chunks in RmarkdownReticulate - 在 Rmarkdown 中运行 python 块
【发布时间】:2018-09-05 06:58:22
【问题描述】:

也许我遗漏了什么,但如果下面的代码是我的 Rmd 文件的内容

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

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

R notebook example 相比,似乎在python 块中为flights 分配了一些东西应该使py$flights 可用于R,但事实并非如此。

问题:

  1. 有没有办法从 R 中访问在以前运行的 Python 块中创建的变量(不是 knit )?如何将在 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 块中为a 赋值对 R 环境中的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

【问题讨论】:

  • This blog post from (today/yesterday) reticulate 作者可能有用
  • 你链接的文档说 reticulate 在 RStudio 的日常构建中,不确定它是否真的进入了 RStudio 的发布版本。 RStudio 已经包含了一种仅使用默认的 python 解释器来运行 Python 块的方法,但没有与 R 的交叉通信,这可能就是您所看到的。
  • 知道对你有用吗?
  • 还是不行,只是用信息编辑了帖子。

标签: python r r-markdown knitr reticulate


【解决方案1】:

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

解决方法: 在职的:

【讨论】:

  • 我尝试在日常构建中运行与问题相同的代码。虽然有些东西肯定发生了变化,但现在运行 python 块会引发错误。
  • 我刚刚澄清它已在桌面(Windows)中修复。您使用的是哪个 RStudio?
【解决方案2】:

Rmarkdown / knitr:

运行块:

目前不支持在不编织文档的情况下运行块。请参阅此处:https://github.com/yihui/knitr/issues/1440Reticulate not sharing state between R/Python cells or Python/Python cells in RMarkdown

编辑: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 对 64)或者我在安装 Python2.7 和单独的 Anaconda 时遇到了麻烦。

【讨论】:

  • py_run_string("x = 10"); py$x 工作正常。好像py_run_string()可以在R环境下修改py,而仅仅运行python是无法修改任何东西的。
  • 要明确:添加knitr::knit_engines$set(...) sn-p 并编织文档仍然不起作用? (目前不支持在不编织的情况下运行块,...)
  • 编织文档效果很好。我认为有一种方法可以单独执行块并将变量“导出”到 R 环境。正如您所说,这是不可能的,在这里github.com/yihui/knitr/issues/1440也找到了相同的。
  • 我接受了这个答案,但我还想补充一点,一种解决方法是将 python 块转换为 R 块,并将整个内容包装在 py_run_string() 函数中,所以无论你在该块中分配什么代码可通过py$variable_name 从 R 访问。
  • 好点,我添加了它并引用了你...你也可以在这里添加你的解决方法:stackoverflow.com/questions/49324289/…
【解决方案3】:

您必须使用 Rstudio 每日构建 (source) 并将 knitrrmarkdown 升级到最新版本。

> packageVersion("rmarkdown")
[1] ‘1.9’
> packageVersion("knitr")
[1] ‘1.20’

【讨论】:

    猜你喜欢
    • 2021-08-27
    • 2014-11-08
    • 2022-08-15
    • 2020-03-14
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    相关资源
    最近更新 更多