从.Rprofile.site中永久删除.libPaths()中的一个库

39

如何在R中永久删除一个库?

.libPaths()
[1] "\\\\per-homedrive1.corp.riotinto.org/homedrive$/Tommy.O'Dell/R/win-library/2.15"
[2] "C:/Program Files/R/R-2.15.2/library"                                            
[3] "C:/Program Files/RStudio/R/library"     

第一项是我的公司“我的文件”文件夹,我的姓氏路径中的撇号在使用“R CMD INSTALL --build”制作软件包时会引起各种问题,更不用说在离线网络时使用安装在那里的软件包时出现的问题了。
我想将“C:/Program Files/R/R-2.15.2/library”作为默认路径,但我不想依赖于“Rprofile.site”。
我尝试过的方法:
> .libPaths(.libPaths()[2:3])
> .libPaths()
[1] "C:/Program Files/R/R-2.15.2/library" "C:/Program Files/RStudio/R/library" 

似乎这样可以工作,但只有在重新启动我的R会话之前,我才能回到原始的.libPaths()输出...
Restarting R session...

> .libPaths()
[1] "\\\\per-homedrive1.corp.riotinto.org/homedrive$/Tommy.O'Dell/R/win-library/2.15"
[2] "C:/Program Files/R/R-2.15.2/library"                                            
[3] "C:/Program Files/RStudio/R/library" 

我认为也许 .libPaths() 使用了 R_LIBS_USER

> Sys.getenv("R_LIBS_USER")
[1] "//per-homedrive1.corp.riotinto.org/homedrive$/Tommy.O'Dell/R/win-library/2.15"

所以我尝试使用Sys.unsetenv("R_LIBS_USER")将其取消设置,但它在会话之间不会持久保存。

附加信息

如果有影响的话,这里有一些可能相关的环境变量...

> Sys.getenv("R_HOME")
[1] "C:/PROGRA~1/R/R-215~1.2"
> Sys.getenv("R_HOME")
[1] "C:/PROGRA~1/R/R-215~1.2"
> Sys.getenv("R_USER")
[1] "//per-homedrive1.corp.riotinto.org/homedrive$/Tommy.O'Dell"
> Sys.getenv("R_LIBS_USER")
[1] "//per-homedrive1.corp.riotinto.org/homedrive$/Tommy.O'Dell/R/win-library/2.15"
> Sys.getenv("R_LIBS_SITE")
[1] ""

我尝试过Sys.unsetenv("R_LIBS_USER"),但这在会话之间也无法保持。

由于它是一个R字符值,我建议尝试转义单引号。 - IRTFM
5个回答

27

只需在Windows中设置环境变量R_LIBS,例如:

R_LIBS=C:/Program Files/R/R-2.15.2/library

重新启动 R。


1
设置 R_LIBS_USER 路径变量对我有帮助。 - KarthikS
3
一个工作的例子看起来像这样:Sys.setenv(R_LIBS_USER = 'C:/Program Files/R/R-2.15.2/library')。(注:该代码是设置R语言中用户自定义包的位置。) - pdbentley
1
这只是将其附加到有问题的内容中,而不是替换它。我用这个答案解决了这个问题。 - Dan Adams

22

这是对问题的稍晚回应,但可能对其他人有用。为了设置我的自定义路径(并删除原始路径之一),我已经:

  • R中使用.libPaths()来检查当前库路径;
  • 确定要保留哪些路径。在我的情况下,它保留了R的原始库,但删除了与我的文档相关的链接。
  • 使用R.home()Sys.getenv("R_HOME")找到R-Home路径;
    • R-Home\R-3.2.2\etc\Rprofile.site会在每次启动R内核时读取。因此,任何修改都将持续影响每次运行R。
  • 通过添加以下内容编辑Rprofile.site

.libPaths(.libPaths()[2]) .libPaths("d:/tmp/R/win-library/3.2")

它是如何工作的?

  • 第一行删除除一个路径外的所有路径(从原始列表中的第二个开始),第二行添加了一个附加路径。我们最终得到两条路径。
  • 请注意,我使用Unix路径表示法,尽管使用Windows。 R始终使用Unix表示法,不受操作系统的影响
  • 重新启动R(使用Ctr+Shift+F10

现在每次都会起作用。


这个答案非常有帮助,但是据我理解,在执行完.libPaths(.libPaths()[2])之后再执行.libPaths("d:/tmp/R/win‑library/3.2"),你只是将_"d:/tmp/R/win‑library/3.2"_设置为路径,因此第一个设置将被覆盖。 - Cryptor
1
不是真的 - 我首先使用 '.libPaths(.libPaths()[2])' 删除除第二个路径以外的所有路径,然后添加 .libPaths("d:/tmp/R/win-library/3.2") 作为额外的路径。最终我得到了两个路径。 - DfAC
1
这并不是那么明显,我在原始文本中添加了注释。 - DfAC
3
这在ubuntu上并不是真的:运行.libPaths(.libPaths()[2])并不能删除其他库。 - Nikita Vlasenko
1
至少对于R 3.5.2而言,根据.libPaths帮助文档,它只会向现有路径添加参数,而不是替换现有路径。 "如果使用new参数调用,则库搜索路径将设置为unique(c(new, .Library.site, .Library))中的现有目录"。 - dracodoc

10

.Rprofile中使用此函数

set_lib_paths <- function(lib_vec) {
  lib_vec <- normalizePath(lib_vec, mustWork = TRUE)
  shim_fun <- .libPaths
  shim_env <- new.env(parent = environment(shim_fun))
  shim_env$.Library <- character()
  shim_env$.Library.site <- character()
  environment(shim_fun) <- shim_env
  shim_fun(lib_vec)
}
set_lib_paths("~/code/library") # where "~/code/library" is your package directory

原文来源:https://milesmcbain.xyz/hacking-r-library-paths/

本文介绍如何在R中修改库路径。当我们安装包时,它们通常会被存储在一个默认的库路径中。然而,在某些情况下,我们可能希望将包存储在不同的位置或不同的库路径中。这篇文章将介绍如何修改默认的库路径以及如何在R中添加新的库路径。


这是在没有管理员权限时从操作系统中移除 R 库的正确步骤。 - Lijia Yu

3

我在我的Windows “个人文档”文件夹中的.Rprofile文件中放置了Sys.unsetenv("R_LIBS_USER")命令。这似乎有所帮助。我的问题是,当通过VPN连接时,处于活动目录环境中使得R启动和包加载非常缓慢。


2

如果你想在RProfile文件(@library/base/R/)中实现这个目标,你可以搜索设置R_LIBS_*环境变量的行(例如Sys.setenv(R_LIBS_SITE=....)Sys.setenv(R_LIBS_USER=.....))。 你还可以搜索设置库树的代码.libPaths()。所以你可以通过在.libPaths()调用之前注释、取消设置和设置R_LIBS变量的组合来实现你的目标。例如:

Sys.unsetenv("R_LIBS")
Sys.unsetenv("R_LIBS_USER")
Sys.setenv(R_LIBS_SITE = "D:/R/libs/site")
Sys.setenv(R_LIBS_USER = "D:/R/libs/user")
Sys.setenv(R_LIBS = "D:/R/libs")

原始问题已经有一段时间了,但我刚刚做了这个,需要添加Sys.unsetenv("R_LIBS_USER")行才能使更改生效。点赞 - codesaurus

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