在Rprofile.site中使用.libPaths更改R默认库路径无效

286

我在Windows上运行R,不是以管理员身份运行。当我安装一个包时,以下命令无法工作:

> install.packages("zoo")
Installing package(s) into ‘C:/Program Files/R/R-2.15.2/library’
(as ‘lib’ is unspecified)
Warning in install.packages :
  'lib = "C:/Program Files/R/R-2.15.2/library"' is not writable

要安装一个包,我需要指定一个库位置:

install.packages("zoo", lib="C:/software/Rpackages")

为了加载一个包,我还需要指定库的位置:
library("zoo", lib.loc="C:/software/Rpackages")

这一切都没问题,但我想知道是否可以以某种方式将C:/software/Rpackages添加到库路径中,从而不必每次都输入它。

在网上搜索时,我发现一种方法是编辑Rprofile.site文件并添加以下行:

.libPaths("C:/software/Rpackages")

然而,在完成这个步骤后,启动RStudio后,我得到了以下输出结果。
> .libPaths()
[1] "C:/Program Files/R/R-2.15.2/library" "C:/Program Files/RStudio/R/library" 

我添加到 Rprofile.site.libPaths 命令似乎没有任何效果!为什么会这样?或者更重要的是,我该如何解决这个问题,以便在不输入库位置的情况下安装和加载包?
注意:如果我启动 RStudio,则 .libPaths() 命令似乎按预期工作。
.libPaths("C:/software/Rpackages")
> .libPaths()
[1] "C:/software/Rpackages"               "C:/Program Files/R/R-2.15.2/library"

这不奇怪吗?


你能详细说明一下 install.packages("zoo") 到底哪里出了问题吗?有错误信息吗? - joran
1
@joran 我在尝试 install.packages("zoo") 时添加了错误信息,但这并不是我的真正问题,我的问题是为什么 Rprofile.site 中的 .libPaths() 不起作用。 - I Like to Code
1
如果您使用RGui而不是R Studio,是否遇到了相同的问题? - Dason
7
为什么R的库路径默认为需要管理员权限的文件夹?用户的主目录不是更合理吗? - geotheory
将RStudio的库路径更改为主目录下的~/.Renviron文件中编辑R_LIBS_USER=/some/path。 - bowen.li
16个回答

302

正确的解决方案是将环境变量R_LIBS_USER设置为您期望的库文件夹的文件路径值,而不是让RStudio识别Rprofile.site文件。

在Windows中设置环境变量R_LIBS_USER,请转到控制面板(系统属性 -> 高级系统属性 -> 环境变量 -> 用户变量),将其设置为所需值(库文件夹的路径),例如:

Variable name: R_LIBS_USER 
Variable value: C:/software/Rpackages  

如果由于某种原因您无法访问控制面板,则可以尝试在Windows命令行中运行rundll32 sysdm.cpl,EditEnvironmentVariables,然后从那里添加环境变量。

设置R_LIBS_USER将确保库首先显示在.libPaths()中,无论是直接启动RStudio还是通过右键单击文件并选择“打开方式”来启动RStudio。

如果始终通过单击RStudio快捷方式来启动RStudio,则Rprofile解决方案可以使用。在这种情况下,将默认工作目录设置为包含您的Rprofile的目录就足够了。但是,当单击文件启动RStudio时,Rprofile解决方案不起作用,因为它会将工作目录更改为默认工作目录以外的目录。


26
绝对是正确的解决方案。唯一的问题是,如果您的用户不是管理员(如果您一开始遇到此问题,则很可能是这种情况),则必须通过控制面板->用户帐户->用户帐户->更改我的环境变量来更改您的环境变量。 - David Moye
1
你知道在Linux命令行中的相应命令吗? - Diego-MX
11
好的,只需将以下内容设置为您的shell变量(在bash中,您可以编辑.bash_profile和/或.bashrc文件)。请参见此处:http://unix.stackexchange.com/questions/117467/how-to-permanently-set-environmental-variables如果要仅在当前会话中设置这些变量,请在控制台中输入以下命令:export R_LIBS_USER='您选择的目录' - Paweł Rumian
神奇的解决方案!这在我的Windows7上使用RStudio完美运行。 - Darwin PC
6
不是通过控制面板设置变量,而是修改了Rprofile文件中的R_LIB_USER默认值。以下是解决方案:我采用了类似的方法,该解决方案在此问题的答案中提供 https://dev59.com/aFwZ5IYBdhLWcg3wNOGI - Marco
显示剩余9条评论

223
我通常会将所有的软件包放在一个库中,但如果你想添加一个库,为什么不将新库(必须已经存在于你的文件系统中)附加到现有的库路径中呢?
.libPaths( c( .libPaths(), "~/userLibrary") )
 # obviously this would need to be a valid file directory in your OS
 # min just happened to be on a Mac that day

或者(这将使用户库成为放置新软件包的首选位置):

.libPaths( c( "~/userLibrary" , .libPaths() ) )

当我最初编写此内容时,我至少得到了以下结果:

> .libPaths()
[1] "/Library/Frameworks/R.framework/Versions/2.15/Resources/library"
[2] "/Users/user_name/userLibrary"  
.libPaths 函数与大多数非图形函数有些不同。它通过副作用工作。报告和更改 R 环境变量的函数 Sys.getenvSys.setenv 已被拆分,但是 .libPaths 可以报告或更改其目标。
关于 R 启动过程的信息可以在 ?Startup 帮助页面中阅读,并且有关 RStudio 的材料可在以下网址找到:https://support.rstudio.com/hc/en-us/articles/200549016-Customizing-RStudio 在您的情况下,似乎 RStudio 没有遵循 Rprofile.site 设置,或者可能通过从其中一个 RStudio 默认设置中读取 .Rprofile 设置来覆盖它们。还应该提到的是,此操作的结果还会附加对 .Library.Library.site 的调用内容,这是 RStudio(或任何其他 IDE 或网络安装的 R)可能表现出不同行为的进一步原因。
由于 Sys.getenv() 返回 R 进程的当前系统环境,因此您可以使用以下命令查看库和其他路径:
Sys.getenv()[ grep("LIB|PATH", names(Sys.getenv())) ]

存储和访问软件包的两个重要位置是(现在在Linux系统上有所不同):

R_LIBS_SITE                          /usr/local/lib/R/site-library:/usr/lib/R/site-library:/usr/lib/R/library
R_LIBS_USER                          /home/david/R/x86_64-pc-linux-gnu-library/3.5.1/
 

13
我需要将 c() 向量反转,以确保新的库被安装到自定义文件夹中。 - geotheory
6
新路径必须实际存在于文件系统中,否则它将不会被添加到库路径中。 - jarandaf
另一个好的点。虽然函数名表明相反,但您可以首先使用file.exists进行检查,仅在路径不丢失时继续进行。 - IRTFM
4
我做了这件事并且它有效,但是好像每次启动R时我都需要更改路径。其他人也是这样吗? - cyrusjan
你是否查看过 ?Startup 来查看使此更改永久化的(许多)选项?如果它们未遵守或可能覆盖了 .libPaths() 设置,则还需要参考 RStudio 手册。 - IRTFM
显示剩余3条评论

27
我通过将代码放置在默认工作目录下的.Rprofile文件中解决了这个问题。首先,我找到了默认工作目录的位置。
> getwd()
[1] "C:/Users/me/Documents"

然后我使用文本编辑器编写了一个简单的.Rprofile文件,其中包含以下行:

.libPaths("C:/software/Rpackages")

最后,当我启动R并运行.libPaths()时,我会得到期望的输出:

> .libPaths()
[1] "C:/software/Rpackages"               "C:/Program Files/R/R-2.15.2/library"
[3] "C:/Program Files/RStudio/R/library"

这对我不起作用(BondedDust的解决方案也是如此)。我创建了一个txt文件,并将其保存为.Rprofile在getwd()文件夹中。 - John
2
@John 我相信我们在说着同样的事情。 - I Like to Code
6
R 会从你的 HOME 目录而不是当前目录读取 .Rprofile 文件。 - kgui
我想到了一个类似的方法,解决方案在这个问题的答案中提供:https://dev59.com/aFwZ5IYBdhLWcg3wNOGI - Marco
在r控制台中输入r命令Sys.getenv("HOME")以查找主目录问题。我不确定您是否获得了所需的输出。我认为所需的输出是42在他的答案https://dev59.com/l2Up5IYBdhLWcg3wmIYt#15170774中展示的内容。他以稍微不同的方式使用.libPaths。 - miracle173
@kgui - 如果当前目录中存在.Rprofile文件,R会从该文件中读取配置信息,而不是从主目录中读取。如果该文件不存在,则会回退到Rprofile.site文件。 - alan ocallaghan


13
我发现了一个我认为是解决方案(这里)(感谢SFU的Carl Schwarz),可以添加一个个人库,无论使用R还是Rstudio都会永久地(不必在每个会话中定义)识别,并且Rstudio将其视为我的Mac机器上的默认选项。我在SO上没有看到它被明确阐述,因此我总结了他们提供的步骤,先是Windows,然后是Mac。

对于Windows 7操作系统:

  1. 在您想要拥有个人库的驱动器上创建一个目录,例如C:\ User \ Rlibs(或其他您拥有权限的目录)

  2. 在Windows搜索栏中搜索/转到“编辑帐户的环境变量”以编辑控制面板设置

  3. 在“环境变量”窗口的中间单击“新建…”

  4. 在“新用户变量”窗口中,将 R_LIBS 键入“变量名称”,并将路径设置为您创建的个人库目录,例如 C:\ User \ Rlibs

  5. 单击“确定”,您应该在用户变量窗口中看到变量/值对

  6. 再次单击“确定”

现在,当您启动R(或Rstudio)并输入命令 .libPaths()时,您应该能够看到您创建的个人库以及R系统库。

对于Mac:

  1. 在你的“主目录”或“用户名”文件夹中创建一个名为Rlibs的文件夹。

  2. 启动Terminal应用程序。

  3. 输入:echo "R_LIBS=~/Rlibs" > .Renviron 确保拼写和大小写匹配。

  4. 输入ls -a以查看目录中的所有文件的完整列表,现在应该包括.Renviron

  5. 验证.Renviron文件是否已正确设置:more .Renviron

启动R/Rstudio并输入.libPaths(),您应该看到指向个人库的新路径。


9

如果您没有管理员权限,打开位于\R-3.1.0\etcRprofile.site文件并添加以下内容也可能有帮助:

.First <- function(){
  .libPaths("your path here")
}

这个在启动时直接评估.libPath()命令


6
在Ubuntu上,更改用户默认库路径的推荐方法是在~/.Renviron文件中设置R_LIBS_USER变量。请参考官方文档
touch ~/.Renviron
echo "R_LIBS_USER=/custom/path/in/absolute/form" >> ~/.Renviron

5

只需将R库的默认文件夹更改为没有管理员权限的目录,例如:

.libPaths("C:/R/libs")

4
我很难理解这个问题。我最近重新安装操作系统和Rstudio时,gorkypl提供了正确的解决方案,但是这一次,设置环境变量并没有解决问题。
卸载R和Rstudio,创建目录C:\ R和C:\ Rstudio,然后重新安装它们。
将R_LIBS_USER用户变量定义为您喜欢的目录(如gorkypl的答案所示),并重新启动计算机以加载用户变量。打开Rstudio,错误应该消失了。
您还可以使用Sys.setenv()将R_LIBS_USER修改为您备用库路径,这更加简便,不需要重新启动计算机。
要查看R_LIBS_USER设置为什么:?Sys.getenv() 阅读help(Startup)对您会有帮助。

2

如果在安装新版本的R或通过其他方式更改默认包库后,您可以使用以下命令将两个库附加以使用所有软件包。

获取现有库路径:

.libPaths()

现在,设置现有和旧路径:

.libPaths(c(.libPaths(), "~/yourOldPath"))

希望能够帮到您。


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