Rpy2 找不到包

问题描述 投票:0回答:7

我在 Windows 7 64 上使用 Rpy2,但在加载包时遇到问题:

在R中:

using(mi)

在Python中:

from rpy2.robjects.packages import importr
mi=importr('mi')

---------------------------------------------------------------------------
RRuntimeError                             Traceback (most recent call last)
<ipython-input-30-2d393a6df544> in <module>()
----> 1 mi=importr('mi')

C:\Anaconda\lib\site-packages\rpy2\robjects\packages.pyc in importr(name, lib_loc, robject_translations, signature_translation, suppress_messages, on_conflict, data)
    397     if _package_has_namespace(rname, 
    398                               _system_file(package = rname)):
--> 399         env = _get_namespace(rname)
    400         version = _get_namespace_version(rname)[0]
    401         exported_names = set(_get_namespace_exports(rname))

RRuntimeError: Error in loadNamespace(name) : there is no package called 'm

有什么建议吗?

python rpy2
7个回答
13
投票

我也有类似的问题:

rpy2.rinterface.RRuntimeError: Error in loadNamespace(name) : there is no package called speedglm

我注意到问题是 rpy2 不知道所有 R 库的位置。就我而言,输入(R)

.libPaths()

给了我

[1] "/home/nbarjest/R/x86_64-redhat-linux-gnu-library/3.4"
[2] "/usr/lib64/R/library"                                
[3] "/usr/share/R/library" 

同时输入(在 Python 3 中)

import rpy2.rinterface
rpy2.rinterface.set_initoptions((b'rpy2', b'--no-save', b'--no-restore', b'--quiet'))
from rpy2.robjects.packages import importr
base = importr('base')
print(base._libPaths())

只给我一个

[1] "/home/nbarjest/R/x86_64-redhat-linux-gnu-library/3.4"

我找不到将其他两个路径附加到base._libpath()的方法。如果您找到方法,请告诉我。我使用了另一种解决方法:

import rpy2
import rpy2.robjects as RObjects
from rpy2.robjects.packages import importr
utils = importr("utils")
d = {'print.me': 'print_dot_me', 'print_me': 'print_uscore_me'}
try:
    thatpackage = importr('speedglm', robject_translations = d, lib_loc = "/home/nbarjest/R/x86_64-redhat-linux-gnu-library/3.4")
except:
    try:
        thatpackage = importr('speedglm', robject_translations = d, lib_loc = "/usr/lib64/R/library")
    except:
        thatpackage = importr('speedglm', robject_translations = d, lib_loc = "/usr/share/R/library")

这有效。我希望其他有同样问题的人发现这很有用。


5
投票

对我来说,在 importr 中,其中的参数 lib_loc 有效,将 first 路径放入 R 中 .libPaths() 的输出中,例如:

importr('name package', lib_loc="/home/nbarjest/R/x86_64-redhat-linux-gnu-library/3.4")

其中路径是@Nbarjest答案的输出示例中的路径。


3
投票

在 python 中:检查 rpy2 使用的 R 版本

import rpy2.robjects as robjects
robjects.r['version']

检查您的 rpy2 库位置

base = importr('base')
print(base._libPaths())

在 R 中:检查此版本 r 的 R 库位置

.libPaths()

将您的 r 版本中安装的库复制到 rpy2 使用的文件夹中。


0
投票

我也有这个问题,我将我需要的包复制到 base._libPaths() ,在这里,它可以工作。

import rpy2.robjects as objects
from rpy2.robjects.packages import importer
base = importr('base')
base._libPaths()[0]

0
投票

我也有类似的问题。我必须卸载 R 并使用管理员权限重新安装它,然后在使用管理员权限运行 R 时重新安装 R 包,这样它将安装到标准库位置(不是个人库)。然后将 R 添加到 PATH 变量,并重新安装 rpy2。


0
投票

我认为 lib_loc 选项在大多数情况下是最好的。

但是,我发现自己处于这样一种情况:在 RHEL 上的 conda 环境中,我需要能够使用 rpy2 从 python 中访问系统库中的许多定制 R 包。这需要设置 .libPaths,我可以使用以下代码来完成此操作:

# Get original libPaths from R as python list:
orig_libs = list(base._libPaths())
new_libs = ['/usr/lib64/R/library','/usr/share/R/library']
# Add new libs to original libPaths:
new_libs.extend(orig_libs)
# Create an R object string vector:
libs = robjects.StrVector(new_libs)
# If you want to check how it will look to R:
#print(libs.r_repr())
# Set with .libPaths:
base._libPaths(libs)

为了使其正常工作,我必须在 R 中设置 R_LIBS_SITE 环境变量:

base.Sys_setenv(R_LIBS_SITE="/usr/lib64/R/library:/usr/share/R/library")

请注意,R 中的 libPaths() 似乎不仅仅粘贴在文本行中,而是尝试变得智能并对库位置进行某种检查,如果库不好则不会包含它们。这给我在故障排除时带来了一些困惑。


-3
投票

这是在 rpy2 的问题跟踪器上交叉发布并回答的:https://bitbucket.org/rpy2/rpy2/issue/265/windows-error-in-loadnamespace

© www.soinside.com 2019 - 2024. All rights reserved.