我在 Windows 7 64 上使用 Rpy2,但在加载包时遇到问题:
using(mi)
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
有什么建议吗?
我也有类似的问题:
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")
这有效。我希望其他有同样问题的人发现这很有用。
对我来说,在 importr 中,其中的参数 lib_loc 有效,将 first 路径放入 R 中 .libPaths() 的输出中,例如:
importr('name package', lib_loc="/home/nbarjest/R/x86_64-redhat-linux-gnu-library/3.4")
,
其中路径是@Nbarjest答案的输出示例中的路径。
在 python 中:检查 rpy2 使用的 R 版本
import rpy2.robjects as robjects
robjects.r['version']
检查您的 rpy2 库位置
base = importr('base')
print(base._libPaths())
在 R 中:检查此版本 r 的 R 库位置
.libPaths()
将您的 r 版本中安装的库复制到 rpy2 使用的文件夹中。
我也有这个问题,我将我需要的包复制到 base._libPaths() ,在这里,它可以工作。
import rpy2.robjects as objects
from rpy2.robjects.packages import importer
base = importr('base')
base._libPaths()[0]
我也有类似的问题。我必须卸载 R 并使用管理员权限重新安装它,然后在使用管理员权限运行 R 时重新安装 R 包,这样它将安装到标准库位置(不是个人库)。然后将 R 添加到 PATH 变量,并重新安装 rpy2。
我认为 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() 似乎不仅仅粘贴在文本行中,而是尝试变得智能并对库位置进行某种检查,如果库不好则不会包含它们。这给我在故障排除时带来了一些困惑。
这是在 rpy2 的问题跟踪器上交叉发布并回答的:https://bitbucket.org/rpy2/rpy2/issue/265/windows-error-in-loadnamespace