.Rprofile中使用default()修改update.packages参数报错如何解决
a) 报错原因
- 核心原因是
.Rprofile加载时,update.packages所属的utils包还未被载入:R启动加载.Rprofile的阶段,仅载入了基础的base包,utils包默认只会在交互式会话完成启动后自动载入,因此此时直接调用update.packages会提示对象不存在。 - 其次你的配置代码存在语法错误:最后清理变量的代码
rm(c("tmpUser", "tmpLibPath")缺少右括号,修正后应为rm(c("tmpUser", "tmpLibPath"))。
b) 实现需求的替代方案
不需要依赖default包,直接在.Rprofile中加入以下配置即可:
# 预先载入utils包,获取目标函数 library(utils) # 确定包安装/更新的目标路径 tmpUser <- Sys.getenv("USER") if (tmpUser == "root") { target_lib <- "/usr/local/lib/R/site-library" } else { target_lib <- Sys.getenv("R_LIBS_USER") # 可选:如果路径不存在自动创建 if (!dir.exists(target_lib)) dir.create(target_lib, recursive = TRUE) } # 重写函数默认参数 formals(install.packages)$lib <- target_lib formals(update.packages)$lib.loc <- target_lib # 清理变量 rm(tmpUser, target_lib)
如果想要更简单的实现,也可以直接调整库路径的优先级,将系统apt安装的库路径放到搜索路径最后,默认安装新包到优先级最高的用户路径,配置如下:
# 调整库路径优先级,系统apt安装的库放到最后 sys_lib <- grep("/usr/lib/R", .libPaths(), value = TRUE) other_libs <- grep("/usr/lib/R", .libPaths(), invert = TRUE, value = TRUE) .libPaths(c(other_libs, sys_lib))
这样默认安装、更新包时都会优先操作用户自定义的路径,不会触发系统路径下apt安装包的更新。
内容的提问来源于stack exchange,提问作者mikemtnbikes
相关产品推荐
相关产品推荐

