问题描述
我尝试安装rpy2,但无法加载任何软件包。
我的Linux是Mint 20,
Python 3.8.2,
R 3.6.3,
rpy2 3.3.5(顺便说一下,是随pip一起安装的)
我记得我跟着有人说过如何从python中安装R软件包,这就是我所做的:
import rpy2.robjects.packages as rpackages
utils.chooseCRANmirror(ind=1)
packnames= ("ggplot2","hexbin")
from rpy2.robjects.vectors import StrVector
# R vector of strings (idk what it does)
names_to_install= [x for x in packnames if not rpackages.isinstalled(x)]
if len(names_to_install) > 0:
utils.install_packages(StrVector(names_to_install))
quit()
# It will create a WARNING as such:
# R[write to console]: 'lib = "/usr/local/lib/R/site-library"' is not writable
# Would you like to use a personal library instead? (yes/No/cancel) yes
# Would you like to create a personal library
# ‘~/R/x86_64-pc-linux-gnu-library/3.6’
# to install packages into? (yes/No/cancel) yes
# SO JUST SAY YES TWICE AND IT WILL CREATE A NEW FOLDER FOR YOUR INSTALLED PACKAGES!!
好的,这样我的软件包就安装在/R/x86_64-pc-linux-gnu-library/3.6
但是后来我改变了这一点,当我从互联网上尝试一些测试代码时,我收到警告,提示我没有软件包。
#!/usr/bin/python3.8
import rpy2
print("rpy2 version is:",rpy2.__version__)
# >>rpy2 version is: 3.3.5
import rpy2.robjects as robjects
# R PACKAGES
# rpy2 is providing a function rpy2.robjects.packages.importr()
# that makes that step very similar to importing Python packages.
from rpy2.robjects.packages import importr
base = importr('base')
utils = importr('utils')
from rpy2.robjects import Formula,Environment
from rpy2.robjects.vectors import IntVector,FloatVector
from rpy2.robjects.lib import grid
from rpy2.robjects.packages import data
from rpy2.rinterface_lib.embedded import RRuntimeError
import warnings
# The R 'print' function
rprint = robjects.globalenv.find("print")
stats = importr('stats')
grdevices = importr('grDevices')
datasets = importr('datasets')
grid.activate()
警告是:
R[write to console]: Warning messages:
R[write to console]: 1:
R[write to console]: In (function (package,help,pos = 2,lib.loc = NULL,character.only = FALSE,:
R[write to console]:
R[write to console]: library ‘/usr/lib/R/site-library’ contains no packages
R[write to console]: 2:
R[write to console]: In (function (package,:
R[write to console]:
R[write to console]: library ‘/usr/lib/R/site-library’ contains no packages
然后我尝试从R安装软件包,所以我sudo打开R并输入
install.packages()
对于一些基本程序包,例如base,utils,grDevices ...,它们被认为是基本程序包,因此它不会对其进行更新。但是我发现他们的路径是“ / usr / lib / R / library”
然后将我要安装的其他软件包(例如ggplot2)安装到“ / usr / local / lib / R / site-library”中,这是第一步安装中需要的。
这两个都不是rpy2想要的。它想要/ usr / lib / R / site-library
但是我什至发现导入这样的软件包时可以添加路径:
base = importr('base',lib_loc="/usr/lib/R/library")
它确实起作用了。
我已经从上方(第二个方框)逐行测试了我的代码,并为使用importr导入的所有软件包添加了代码。
而且大多数from x import y
都可以正常工作。只是没有网格。
from rpy2.robjects.lib import grid
仍然给我同样的“库'/ usr / lib / R / site-library'不包含软件包”的信息。
但我不知道如何在其中添加路径!
我和我的教授尝试了2天的解决方案。我真的很绝望。 为什么路径甚至是这样的问题?我没有看到有人谈论它选择的默认路径不正确,而且我发现的所有内容仅适用于Windows!如果默认值不正确,那不是在文档中吗?如果它对其他所有人都有效,那我做错了什么?
R library contains no packages 是一个类似的问题,但是他的rpy2想使用usr / local / lib,对我而言这是正确的! (并没有真正的答案,至少我不了解)
解决方法
R可以通过多种方式安装,可以在配置(可能是安装)时指定接收软件包的默认目录。如果您为整个系统安装了R,并且假定这是唯一安装的R,则我们将其称为“系统R”和安装R的目录,并安装了默认(“推荐”)软件包以及其他软件包。软件包将安装在/usr
下。如果您使用的是预编译和打包的R(例如RPM或deb),则确切位置将取决于该二进制包。在该目录中写内容通常需要提升的特权,这就是为什么您需要sudo
。
除了该目录外,还可以指定其他目录,其中应安装R软件包。当R提示您提供使用用户本地目录的提示时,就是这种情况。 (请注意:您的软件包随后将安装在~/R/x86_64-pc-linux-gnu-library/3.6
中,而不是/R/x86_64-pc-linux-gnu-library/3.6
中)。在R中,命令.libPaths()
会告诉您R在哪里寻找其软件包,并且该函数的R文档将列出R如何获取该信息。
最后,您列出了一些包含软件包的目录,或者没有软件包,或者在您的问题中可能已安装软件包的位置:
-
/usr/local/lib/R/site-library
-
~/R/x86_64-pc-linux-gnu-library/3.6
-
/usr/lib/R/site-library
-
/usr/lib/R/library
几乎可以肯定的是,您在何处安装了软件包,以及您认为它们在何处安装了。自sudo
起,我建议您卸载并重新安装R,按照R的建议在个人库中安装软件包,并设置环境变量R_LIBS_USER
指向该目录(请参见{ {3}})。