Je voudrais accéder à R depuis un programme Python. Je connais Rpy2, pyrserve et PypeR.
Quels sont les avantages ou les inconvénients de ces trois options?
Je connais l'un des 3 mieux que les autres, mais dans l'ordre donné dans la question:
rpy2:
pyrserve:
pyper:
edit: Prise en charge de Windows pour rpy2
Extrait de l'article du Journal of Statistical Software on PypeR :
RPy présente un moyen simple et efficace d'accéder à R depuis Python. Il est robuste et très pratique pour les opérations d'interaction fréquentes entre Python et R. Ce paquet permet aux programmes Python de passer Python des objets de types de données de base aux fonctions R et renvoyer les résultats dans des objets Python. Ces fonctionnalités en font une solution intéressante pour les cas où Python et R interagissent) Cependant, il existe encore des limitations de ce package comme indiqué ci-dessous.
Performance:
RPy peut ne pas se comporter très bien pour les ensembles de données de grande taille ou pour les tâches à forte intensité de calcul. Beaucoup de temps et de mémoire sont inévitablement consommés pour produire la copie Python des données R, car à chaque tour d'une conversation, RPy convertit la valeur renvoyée d'une expression R en Python objet de types de base ou tableau NumPy. RPy2, une branche récemment développée de RPy, utilise Python objets pour faire référence aux objets R au lieu de les recopier dans Python objects. Cette stratégie évite les conversions fréquentes de données et améliore la vitesse. Cependant, la consommation de mémoire reste un problème. [...] Lorsque nous avons implémenté WebArray (Xia et al. 2005), une plateforme en ligne pour l'analyse de données de puces à ADN , un travail consommait environ un quart de temps de calcul supplémentaire si vous exécutiez R via RPy au lieu de passer par l'interface utilisateur de ligne de commande de R. Par conséquent, nous avons décidé d'exécuter R dans Python via des canaux dans des développements ultérieurs, par exemple , WebArrayDB (Xia et al. 2009), qui a conservé les mêmes performances que lors de l'exécution indépendante de R. Nous ne connaissons pas les raisons exactes pour une telle différence de performances, mais nous avons remarqué que RPy utilise directement la bibliothèque partagée de R pour exécuter les scripts R. En revanche, exécuter R via des canaux signifie exécuter directement l'interpréteur R.
Mémoire:
R a été dénoncé pour son utilisation non économique de la mémoire. La mémoire utilisée par les objets R de grande taille est rarement libérée après la suppression de ces objets. Parfois, la seule façon de libérer de la mémoire de R est de quitter R. Le module RPy encapsule R dans un objet Python. Cependant, la bibliothèque R restera en mémoire même si le Python objet est supprimé. En d'autres termes, la mémoire utilisée par R ne peut pas être libérée tant que le script Host Python n'est pas terminé.
Portabilité:
En tant que module avec des extensions écrites en C, le package source RPy doit être compilé avec une version R spécifique sur les systèmes POSIX (Portable Operating System Interface for Unix), et le R doit être compilé avec la bibliothèque partagée activée . De plus, les distributions binaires pour Windows sont liées à des combinaisons spécifiques de différentes versions de Python/R, il est donc assez fréquent qu'un utilisateur ait du mal à trouver une distribution qui correspond à l'environnement logiciel de l'utilisateur.
Du point de vue d'un développeur, nous avions l'habitude d'utiliser rpy/rpy2 pour fournir des fonctions statistiques et de dessin à notre application basée sur Python. Cela a causé d'énormes problèmes dans la livraison de notre application car rpy/rpy2 doit être compilé pour des combinaisons spécifiques de Python et R, ce qui nous rend impossible de fournir des distributions binaires qui fonctionnent hors de la boîte à moins que nous regroupons également R. Parce que rpy/rpy2 ne sont pas particulièrement faciles à installer, nous avons fini par remplacer les parties pertinentes par des modules natifs Python tels que matplotlib. Nous serions passés à pyrserve si nous devions utiliser R car nous pourrions démarrer un serveur R localement et nous y connecter sans nous soucier de la version de R.
dans pyper, je ne peux pas passer une grande matrice de python à l'instance r avec assign (). Cependant, je n'ai pas de problème avec rpy2. c'est juste mon expérience.