问题
Maybe I'm missing something, but if the following code is the content of my Rmd file
```{r}
library(reticulate)
use_virtualenv("r-reticulate")
py_available(TRUE)
```
```{python}
a = 7
print(a)
```
```{r}
py$a
```
when I Knit the file, the output for the last chunk is 7 (as expected). On the other hand, clicking the run all button in Rstudio (or running chunks one by one), results on NULL
for the last chunk.
Comparing with the R notebook example it seems like assigning something to flights
in the python chunk should make py$flights
available for R, but that doesn't seem the case.
Questions:
- Is there a way to access from R a variable created in a Python chunk previously ran (not knit)? How to "export" to R a variable created within a python chunk?
- What is a good reference to understand what happens when I click the run button in a python chunk of a Rmarkdown file?
EDIT: Ok so after seeing the first answers here, I did update both knitr and rmarkdown to the latest version, but still had the same problem.
I added py_available(TRUE)
to my file to make sure it was initialized, still, last chunk results in 7
when knitted, but running chunks one-by-one results in
> py$a
Error in py_get_attr_impl(x, name, silent) :
AttributeError: 'module' object has no attribute 'a'
The problem is: Assigning a value to a
in the python chunk isn't doing anything to py$a
in the R environment. Maybe this "shared" environment between R and python isn't how the package is supposed to work? Also, for some extra information
> 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
回答1:
Rmarkdown / knitr:
Running the chunks:
Running the chunks without knitting the document is not supported so far. See here: https://github.com/yihui/knitr/issues/1440 or Reticulate not sharing state between R/Python cells or Python/Python cells in RMarkdown.
Edit: Workaround by 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."
Knitting the document:
One way is to upgrade knitr
as suggested above, but you dont have to and you also dont need RStudio daily build.
If you have a version of knitr prior to 1.18, you can include:
```{r setup, include = FALSE}
knitr::knit_engines$set(python = reticulate::eng_python)
```
, see here: https://rstudio.github.io/reticulate/articles/r_markdown.html#engine-setup.
Python:
If it doesnt work ensure the python connection is running outside of rmarmdown/knitr:
py_run_string("x = 10"); py$x
.
In case that also doesnt work, you should check:
py_available()
and py_numpy_available()
.
If it returns FALSE
: Try to initialize it with: py_available(TRUE)
.
If that´s still a no - check your config:
py_config()
It will give you further hints on the problem:
Examples for me were: different bit versions of R and python (32 vs 64) or somehow i ran into trouble having installed both Python2.7 and seperately Anaconda.
回答2:
You must use the Rstudio daily build (source) and upgrade knitr
, rmarkdown
to the latest version.
> packageVersion("rmarkdown")
[1] ‘1.9’
> packageVersion("knitr")
[1] ‘1.20’
回答3:
This is fixed in current RStudio Desktop e.g. 1.2.1114
. But if you are like me stuck with RStudio Server Pro 1.1.456 a better workaround than using py_run_string
might be to use reticulate::repl_python()
which gives you a Python console within the R console and allows you to run your python chunks by copy pasting them into the console.
workaround: working:
来源:https://stackoverflow.com/questions/49503195/reticulate-running-python-chunks-in-rmarkdown