R,Python:在rpy2上安装软件包

15

我正在使用通过rpy2库在我的Python脚本中使用R,我需要一个在R的默认安装中不存在的软件包。如何安装它?

install.packages("DirichletReg", repos="http://r-forge.r-project.org")

不会起作用。

关于Python:

>>> install.packages("DirichletReg", repos="http://r-forge.r-project.org") 
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'install' is not defined

还有从 R 中获取的数据:

> install.packages("DirichletReg", repos="http://r-forge.r-project.org")
Installing package(s) into ‘/usr/local/lib/R/site-library’
(as ‘lib’ is unspecified)
Warning message:
In getDependencies(pkgs, dependencies, available, lib) :
  package ‘DirichletReg’ is not available (for R version 2.14.1)
3个回答

48

Ricardo的回答不再适用。

要从Python安装,我们可以使用utils.install_packages函数:

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

(那个utils包是R.utils包,它的pdf文档可以在这里找到:https://CRAN.R-project.org/package=R.utils - 或者,更直接地,在这里找到我们使用的更详细的install.packages函数文档:https://www.rdocumentation.org/packages/utils/versions/3.6.2/topics/install.packages。它在Python中被重命名为install_packages,因为.在R中是合法的名称的一部分,但在Python中不是。)

接下来,你需要决定从哪个仓库获取这个包。

当调用utils.install_packages时,你可以使用repos参数声明仓库:

utils.install_packages('DirichletReg', repos="https://cloud.r-project.org")

或者,在调用 utils.install_packages 之前设置镜像:

utils.chooseCRANmirror(ind=1) # select the first mirror in the list
或者
utils.chooseBioCmirror(ind=1) # select the first mirror in the list

否则 Python/R 将尝试启动交互镜像选择器(可能与您的设置不兼容)。

然后,对于单个软件包:

utils.install_packages('DirichletReg')

或者对于多个软件包,将其传递给一个字符向量:

from rpy2.robjects.vectors import StrVector

package_names = ('ggplot2', 'hexbin')
utils.install_packages(StrVector(package_names))

这些例子改编自rpy2文档install.packages文档,截至我最后一次编辑时,该文档仍建议这样做。


1
我更喜欢同时提供'repos'参数,因为上次在jupyter笔记本中尝试使用弹出菜单选择镜像时失败了:utils.install_packages('gutenbergr', repos='https://cloud.r-project.org') - wordsforthewise
这段代码在rpy 3.5.5中不再适用:NotImplementedError: Conversion 'rpy2py' not defined for objects of type '<class 'rpy2.rinterface.SexpClosure'>' - wordsforthewise

5

运行pytest时,Aaron的答案会导致我的Python挂起且R不断出现错误消息,可能是由于以下原因:

在选择镜像之前调用install_packages()将要求用户交互选择一个镜像。

根据rpy2文档,我使用了以下内容,它起作用:

from rpy2 import robjects
import rpy2.robjects.packages as rpackages

utils = rpackages.importr('utils')
utils.chooseCRANmirror(ind=1)
utils.install_packages("DirichletReg")
DirichletReg = rpackages.importr("DirichletReg")

1
我认为这个条件是在R中已经安装了该软件包的情况下才能正常工作。 - LCheng
@LCheng 谢谢,我没有测试过在R中未安装软件包的情况。 - loikein

-4

这个怎么样?

>>> import rpy2.interactive as r
>>> r.importr("utils")
>>> package_name = "DirichletReg"
>>> r.packages.utils.install_packages(package_name)

5
不再起作用。请参考Aaron的答案,该答案目前可行。 - wordsforthewise

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接