Comment exécuter Python dans R

Même si j'aime R, il est clair que Python est également un excellent langage, à la fois pour la science des données et l'informatique générale. Et il peut y avoir de bonnes raisons pour lesquelles un utilisateur R voudrait faire certaines choses en Python. C'est peut-être une excellente bibliothèque qui n'a pas (encore) d'équivalent R. Ou une API à laquelle vous souhaitez accéder qui a un exemple de code en Python mais pas R.

Grâce au package R reticulate, vous pouvez exécuter du code Python directement dans un script R et passer des données dans les deux sens entre Python et R.

En plus de réticuler, vous avez besoin de Python installé sur votre système. Vous avez également besoin de tous les modules, packages et fichiers Python dont dépend votre code Python.

Si vous souhaitez suivre, installez et chargez reticulate avec  install.packages("reticulate")et library(reticulate).

Pour simplifier les choses, commençons avec seulement deux lignes de code Python pour importer le package NumPy pour le calcul scientifique de base et créer un tableau de quatre nombres. Le code Python ressemble à ceci:

importer numpy comme np

mon_python_array = np.array ([2,4,6,8])

Et voici une façon de le faire correctement dans un script R:

py_run_string ("importer numpy en tant que np")

py_run_string ("my_python_array = np.array ([2,4,6,8])")

La py_run_string()fonction exécute tout le code Python qui se trouve entre parenthèses et guillemets. 

Si vous exécutez ce code dans R, il se peut que rien ne se soit produit. Rien n'apparaît dans votre volet d'environnement RStudio et aucune valeur n'est renvoyée. Si vous exécutez print(my_python_array)en R, vous obtenez une erreur qui my_python_arrayn'existe pas.

Mais si vous exécutez une   commande d'impression Python dans la py_run_string()fonction telle que 

py_run_string ("pour l'élément dans my_python_array: print (élément)")

vous devriez voir un résultat. 

Cela va devenir ennuyeux d'exécuter du code Python ligne par ligne comme ça, si vous avez plus de quelques lignes de code. Il existe donc quelques autres façons d'exécuter Python dans R et de réticuler.

La première consiste à mettre tout le code Python dans un fichier .py normal et à utiliser la py_run_file()fonction. Une autre façon que j'aime est d'utiliser un document R Markdown. 

R Markdown vous permet de combiner du texte, du code, des résultats de code et des visualisations dans un seul document. Vous pouvez créer un nouveau document R Markdown dans RStudio en choisissant Fichier> Nouveau fichier> R Markdown.

Les morceaux de code commencent par trois backticks ( ```) et se terminent par trois backticks, et ils ont un arrière-plan gris par défaut dans RStudio.

Ce premier bloc est pour le code R - vous pouvez le voir avec le rsuivant le crochet ouvrant. Il charge le package reticulate, puis vous spécifiez la version de Python que vous souhaitez utiliser. (Si vous ne spécifiez pas, il utilisera votre système par défaut.)

```{r setup, include=FALSE, echo=TRUE}

library(reticulate)

use_python("/usr/bin/python")

```

Ce deuxième morceau ci-dessous est pour le code Python. Vous pouvez taper le Python comme vous le feriez dans un fichier Python. Le code ci-dessous importe NumPy, crée un tableau et imprime le tableau.

`` `{python}

importer numpy comme np

mon_python_array = np.array ([2,4,6,8])

pour l'élément dans my_python_array:

imprimer (élément)

''

Voici la partie intéressante: vous pouvez utiliser ce tableau dans R en le désignant par py$my_python_array(en général, py$objectname).

Dans ce morceau de code suivant, je stocke ce tableau Python dans une variable R appelée my_r_array. Et puis je vérifie la classe de ce tableau.

`` `{r}

my_r_array <- py $ my_python_array

classe (my_r_array)

''

C'est un «tableau» de classe, ce qui n'est pas exactement ce que vous attendez d'un objet R comme celui-ci. Mais je peux le transformer en vecteur régulier avec as.vector(my_r_array)et exécuter toutes les opérations R que je souhaite, comme multiplier chaque élément par 2. 

`` `{r}

mon_r_vector <- as.vector (py $ my_python_array)

classe (mon_r_vector)

mon_r_vector <- mon_r_vector * 2

''

Prochaine partie cool: je peux utiliser cette variable R en Python, comme r.my_r_array(plus généralement r.variablename), comme 

`` `{python}

my_python_array2 = r.my_r_vector

imprimer (mon_python_array2)

''

Si vous souhaitez voir à quoi cela ressemble sans configurer Python sur votre système, regardez la vidéo en haut de cette histoire.