RPY2: импортер не работает с .Renviron - PullRequest
3 голосов
/ 16 июня 2011

Вот что должно произойти с использованием rpy2.robjects.packages.importr для базовых R-пакетов (например, stats):

>>> from rpy2.robjects.packages import importr
>>> importr('stats')
<rpy2.robjects.packages.SignatureTranslatedPackage object at 0x7f3810>

но с внешним пакетом (например, ggplot2) это результат:

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

Сложность состоит в том, что в моем домашнем каталоге у меня есть файл .Renviron, определяющий местоположение моей пользовательской библиотеки (где, например, ggplot2 libs), и у меня нет проблем ни с одной из R-команд library() или require() с использованием R и Rscript. Путь выглядит примерно так:

R_LIBS_USER="/path/to/my/packages"

Итак, мой вопрос: почему мой путь к библиотеке пользователя исключен из «списка поиска», который используется Rpy2? Или, скорее, как мне направить Rpy2 на путь R_LIBS_USER?

Я предполагаю, что проблема связана с окружающей средой, используемой Rpy2, но мое невежество в этом отношении велико.

R: 2.13.0
Platform: x86_64-apple-darwin9.8.0/x86_64 (Mac, 10.6, 64-bit)

повторяется с

Rpy2: 2.1.8, 2.2.1 (dev)

Я регулярно использую R, ggplot2 и python, поэтому любая информация очень приветствуется.

1 Ответ

2 голосов
/ 16 июня 2011

По умолчанию rpy2 инициализируется в «ванильном» режиме, и это игнорирует R_LIBS и друзей.

>>> import rpy2.rinterface 
>>> rpy2.rinterface.get_initoptions()
('rpy2', '--quiet', '--vanilla', '--no-save')
>>> 

Вы можете использовать 'rinterface.set_initoptions ()', чтобы изменить их.

Например:

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