RPY2: Importr fallisce con .renviron
Domanda
Ecco cosa dovrebbe e accade usando rpy2.robjects.packages.importr
per i pacchetti R di base (ad es. stats
):
>>> from rpy2.robjects.packages import importr
>>> importr('stats')
<rpy2.robjects.packages.SignatureTranslatedPackage object at 0x7f3810>
Ma con un pacchetto esterno (ad es. ggplot2
) questo è il risultato:
>>> importr('ggplot2')
Warning message:
In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE, :
there is no package called 'ggplot2'
Error in .Primitive("as.environment")("package:ggplot2") :
no item called "package:ggplot2" on the search list
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/7.0/lib/python2.7/site-packages/rpy2/robjects/packages.py", line 100, in importr
env = _as_env(rinterface.StrSexpVector(['package:'+name, ]))
rpy2.rinterface.RRuntimeError: Error in .Primitive("as.environment")("package:ggplot2") :
no item called "package:ggplot2" on the search list
Una complicazione è che nella mia home directory ho il file .Renviron
Definisci la posizione della mia libreria utente (dove, ad esempio, ggplot2
i libs sono) e non ho problemi con nessuno dei comandi R library()
o require()
usando R
e Rscript
. Il percorso assomiglia a questo:
R_LIBS_USER="/path/to/my/packages"
Quindi la mia domanda è perché il mio percorso di biblioteca utente è escluso dall'elenco di ricerca " Rpy2
usi? O, piuttosto, come posso dirigere Rpy2
per guardare nel R_LIBS_USER
anche un percorso?
Presumo che il problema derivi dall'ambiente Rpy2
usi, ma la mia ignoranza è alta in questo senso.
R: 2.13.0
Platform: x86_64-apple-darwin9.8.0/x86_64 (Mac, 10.6, 64-bit)
replicato con
Rpy2: 2.1.8, 2.2.1 (dev)
Uso regolarmente R, Ggplot2 e Python, quindi ogni intuizione è molto benvenuta.
Soluzione
Per impostazione predefinita, RPY2 sta iniziando in modalità "vaniglia" e questo ignora R_LIBS e amici.
>>> import rpy2.rinterface
>>> rpy2.rinterface.get_initoptions()
('rpy2', '--quiet', '--vanilla', '--no-save')
>>>
È possibile utilizzare 'Rinterface.set_initoptions ()' per modificarli.
Per esempio:
import rpy2.rinterface as ri
ri.set_initoptions(('rpy2', '--verbose', '--no-save'))
ri.initr()
# from now on, just import the rest of rpy2 modules without thinking of the above.