网状 - 在Rmarkdown

时间:2018-03-27 01:48:18

标签: python r r-markdown knitr reticulate

也许我错过了什么,但如果以下代码是我的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块中创建的变量(不是编织)?如何“导出”R在python块中创建的变量?
  2. 什么是一个很好的参考,以了解当我点击Rmarkdown文件的python块中的运行按钮时会发生什么?
  3. 编辑:好的,在看到第一个答案之后,我确实更新了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
    

3 个答案:

答案 0 :(得分:4)

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的麻烦。

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

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

解决方法: https://blogs.cisco.com/performance/can-i-mpi_send-and-mpi_recv-with-a-count-larger-than-2-billion 工作: workaround