web-dev-qa-db-fra.com

Reticulate - Exécution de fragments python dans Rmarkdown

Peut-être qu'il me manque quelque chose, mais si le code suivant est le contenu de mon fichier Rmd

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

quand je tricote le fichier, la sortie du dernier morceau est 7 (comme prévu). D'autre part, en cliquant sur le bouton Tout exécuter dans Rstudio (ou en exécutant des morceaux un par un), le résultat est NULL pour le dernier morceau. 

En comparant avec l'exemple de bloc-notes -R , il semblerait que l'attribution d'un élément à flights dans le morceau python devrait permettre à py$flights d'être disponible pour R, mais cela ne semble pas être le cas.

Des questions: 

  1. Existe-t-il un moyen d’accéder depuis R à une variable créée dans un bloc Python précédemment exécuté (non tricoté)? Comment "exporter" vers R une variable créée dans un morceau python? 
  2. Quelle est une bonne référence pour comprendre ce qui se passe lorsque je clique sur le bouton Exécuter dans une partie python d’un fichier Rmarkdown?

EDIT: Ok donc après avoir vu les premières réponses ici, j'ai mis à jour knitr et rmarkdown vers la dernière version, mais le problème était toujours le même . J'ai ajouté py_available(TRUE) à mon fichier. assurez-vous qu’il a été initialisé; malgré tout, le dernier morceau a pour résultat 7 lorsqu’il est tricoté, mais l’exécution des morceaux un par un donne des résultats 

> py$a
Error in py_get_attr_impl(x, name, silent) : 
  AttributeError: 'module' object has no attribute 'a'

Le problème est le suivant: assigner une valeur à a dans le morceau python ne fait rien à py$a dans l'environnement R. Peut-être que cet environnement "partagé" entre R et python n'est pas ce que le paquet est censé fonctionner? Aussi, pour quelques informations supplémentaires

> 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
7
Freguglia

Ceci est corrigé dans RStudio Desktop actuel, par ex. 1.2.1114. Mais si vous êtes comme moi coincé avec RStudio Server Pro 1.1.456, une meilleure solution de contournement que d'utiliser py_run_string pourrait être d'utiliser reticulate::repl_python() qui vous donne une console Python dans la console R et vous permet d'exécuter vos fragments python en les collant dans la console .

solution de contournement:  workaround travail:  working

1
jan-glx

Rmarkdown/knitr:

Exécuter les morceaux:

L'exécution des morceaux sans tricoter le document n'est pas prise en charge jusqu'à présent. Voir ici: https://github.com/yihui/knitr/issues/1440 ou État de partage non réticulé entre les cellules R/Python ou les cellules Python/Python dans RMarkdown .

Edit: Solution de contournement par Freguglia:

"La solution consiste à transformer les morceaux python en morceaux R et à envelopper tout le contenu dans la fonction py_run_string (), de sorte que tout ce que vous affectez dans ce morceau de code soit accessible à partir de R par py $ nom_variable."

Tricoter le document: _

Une solution consiste à mettre à niveau knitr comme suggéré ci-dessus, mais vous n’avez pas à le faire et vous n’avez pas besoin non plus de la construction quotidienne de RStudio.

Si vous avez une version de knitr antérieure à 1.18, vous pouvez inclure:

```{r setup, include = FALSE} knitr::knit_engines$set(python = reticulate::eng_python) ``` , voir ici: https://rstudio.github.io/reticulate/articles/r_markdown.html#engine-setup .

Python:

Si cela ne fonctionne pas, assurez-vous que la connexion python fonctionne en dehors de rmarmdown/knitr: py_run_string("x = 10"); py$x.

Au cas où cela ne fonctionnerait pas, vous devriez vérifier: py_available() et py_numpy_available().

S'il renvoie FALSE: Essayez de l'initialiser avec: py_available(TRUE).

Si c'est toujours non - vérifiez votre config: py_config()

Cela vous donnera d'autres indications sur le problème:

Les exemples pour moi étaient: différentes versions de bits de R et de python (32 vs 64) ou d’une manière ou d’une autre, j’ai eu des problèmes pour installer Python2.7 et Anaconda séparément. 

4
BigDataScientist

Vous devez utiliser la version quotidienne de Rstudio ( source ) et mettre à niveau knitr, rmarkdown vers la dernière version.

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