Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reticulate - Running python chunks in Rmarkdown

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:

  1. 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?
  2. 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
like image 561
Freguglia Avatar asked Mar 27 '18 01:03

Freguglia


People also ask

How do I use chunks in R Markdown Python?

To add a Python code chunk to an R Markdown document, you can use the chunk header ```{python} , e.g., ```{python} print("Hello Python!") ```

Can you run Python in R Markdown?

The reticulate package includes a Python engine for R Markdown that enables easy interoperability between Python and R chunks.

Can you run code in R Markdown?

You can open it here in RStudio Cloud. or by typing the chunk delimiters ```{r} and ``` . When you render your . Rmd file, R Markdown will run each code chunk and embed the results beneath the code chunk in your final report.

How do I run a Python file in RStudio?

Run Python Scripts in the RStudio IDE To get started writing Python in the RStudio IDE, go to File, New File, then Python Script. Code just as you would in an R script. The RStudio IDE provides several useful tools for your Python development: The RStudio environment pane displays the contents of Python modules.


1 Answers

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.

like image 135
Tonio Liebrand Avatar answered Oct 01 '22 01:10

Tonio Liebrand