网状 - Rmarkdown 中的 运行 python 块
Reticulate - Running python chunks in Rmarkdown
也许我遗漏了什么,但如果下面的代码是我的 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,但这似乎不是案例.
问题:
- 有没有办法从 R 访问之前 运行(不是 knit)在 Python 块中创建的变量?如何 "export" 到 R 在 python 块中创建的变量?
- 要了解当我在 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 之间的这个 "shared" 环境不是包应该如何工作?另外,一些额外的信息
> 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
您必须使用 Rstudio 日常构建 (source) 并将 knitr
、rmarkdown
升级到最新版本。
> packageVersion("rmarkdown")
[1] ‘1.9’
> packageVersion("knitr")
[1] ‘1.20’
Rmarkdown/knitr:
运行 块:
运行暂时不支持不编织文档的分块。参见此处:https://github.com/yihui/knitr/issues/1440 or Reticulate not sharing state between R/Python cells or Python/Python cells in RMarkdown.
编辑:Freguglia 的解决方法:
"Workaround is to turn python chunks into R chunks and just wrap the whole content in the py_run_string() function, so whatever you assign in that piece of code is accessible from R by py$variable_name."
正在编织文档:
一种方法是按照上面的建议升级 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()
.
如果 returns FALSE
: 尝试初始化它: py_available(TRUE)
.
如果还是不行 - 请检查您的配置:
py_config()
它会给你进一步的问题提示:
我的例子是:R 和 python 的不同位版本(32 对 64)或者我 运行 在安装 Python2.7 和单独的 Anaconda 时遇到麻烦。
这在当前的 RStudio 桌面中已修复,例如1.2.1114
。但是,如果您像我一样坚持使用 RStudio Server Pro 1.1.456,那么比使用 py_run_string
更好的解决方法可能是使用 reticulate::repl_python()
,它会在 R 控制台中为您提供一个 Python 控制台,并允许您将 运行 你的 python 块复制粘贴到控制台中。
解决方法:
在职的:
也许我遗漏了什么,但如果下面的代码是我的 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,但这似乎不是案例.
问题:
- 有没有办法从 R 访问之前 运行(不是 knit)在 Python 块中创建的变量?如何 "export" 到 R 在 python 块中创建的变量?
- 要了解当我在 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 之间的这个 "shared" 环境不是包应该如何工作?另外,一些额外的信息
> 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
您必须使用 Rstudio 日常构建 (source) 并将 knitr
、rmarkdown
升级到最新版本。
> packageVersion("rmarkdown")
[1] ‘1.9’
> packageVersion("knitr")
[1] ‘1.20’
Rmarkdown/knitr:
运行 块:
运行暂时不支持不编织文档的分块。参见此处:https://github.com/yihui/knitr/issues/1440 or Reticulate not sharing state between R/Python cells or Python/Python cells in RMarkdown.
编辑:Freguglia 的解决方法:
"Workaround is to turn python chunks into R chunks and just wrap the whole content in the py_run_string() function, so whatever you assign in that piece of code is accessible from R by py$variable_name."
正在编织文档:
一种方法是按照上面的建议升级 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()
.
如果 returns FALSE
: 尝试初始化它: py_available(TRUE)
.
如果还是不行 - 请检查您的配置:
py_config()
它会给你进一步的问题提示:
我的例子是:R 和 python 的不同位版本(32 对 64)或者我 运行 在安装 Python2.7 和单独的 Anaconda 时遇到麻烦。
这在当前的 RStudio 桌面中已修复,例如1.2.1114
。但是,如果您像我一样坚持使用 RStudio Server Pro 1.1.456,那么比使用 py_run_string
更好的解决方法可能是使用 reticulate::repl_python()
,它会在 R 控制台中为您提供一个 Python 控制台,并允许您将 运行 你的 python 块复制粘贴到控制台中。
解决方法: