我之前问了这个问题,但仍然无法让它运转起来。我正在尝试在启动R时安装自定义程序包。我们现在编写的许多代码可供用户编辑。为了尝试保护代码,我正在打包生产级代码,并让用户在启动时将其安装在他们的机器上。
但是,当我尝试在RProfile.site文件中安装软件包时,程序进入循环并且R不断地反复启动。我注意到包中的锁文件与R中的库文件夹中的包一起创建。
以下是我添加到网站文件中的代码:
if(length(grep("customPackage", installed.packages()[,1]))==0) {
install.packages("customPackage", repos=NULL, type="source")
}
当我尝试在启动R之后运行此代码(不更改站点文件)时,它会完全安装该程序包并继续运行。但是,当我尝试通过RProfile文件执行此操作时,就会产生问题。
上次我尝试解决这个问题(https://stackoverflow.com/questions/10610067/installing-packages-upon-starting-r-session),我认为Justin建议使用if语句检查包可以解决问题。但这似乎只能解决我从CRAN安装的软件包而不是自定义软件包的问题。
非常感谢任何有关此事的帮助!
答案 0 :(得分:4)
我不明白你为什么要这样做。让他们将.libPaths
指向同一个地方。即,而不是install.packages(...)
,只需在Rprofile.site中添加一行
.libPaths('/path/to/common/libraries')
require("commonPackage")
您可以做的另一件事是拨打system
电话。我不太了解在Windows下安装软件包,但在类似Unix的情况下,不是使用install.packages
,你可以这样做:
system("R --vanilla CMD INSTALL customPackage")
除其他外,--vanilla
标志导致R在不使用Rprofile.site文件的情况下启动(问题是R启动时正在读取Rprofile.site文件,但Rprofile.site文件告诉R安装一个需要启动R的包,它反过来读取你的Rprofile.site文件......等等。据推测,R --no-site-file INSTALL customPackage
也可以。
修改强>
在咨询this SO answer后,看起来你可以在Windows上做这样的事情(假设你已经安装了Rtools),虽然我还没有测试过。
system("Rcmd --vanilla INSTALL customPackage")
答案 1 :(得分:0)
您可以使用以下功能安装软件包,而无需重新加载.Rprofile
:
surround <- function(x, with) {
paste0(with, x, with)
}
peq <- function(x, y) paste(x, y, sep = " = ")
install.packages.vanilla <- function(pkgs, ...){
arguments <- as.list(match.call())[-1]
if(!"repos" %in% names(arguments)){
arguments$repos <- getOption("repos")
}
names_args <- names(arguments)
installArgs <- purrr::map_chr(seq_along(arguments),
function(i){
value <- arguments[[i]]
peq(names_args[i], ifelse(length(value)<2, deparse(value), as.character(list(value))))
})
installArgs <- stringr::str_replace_all(installArgs, "\"", "'")
installCmd <- paste0("utils::install.packages(",
paste(installArgs, collapse = ", "),
")")
fullCmd <- paste(
surround(file.path(R.home("bin"), "R"), with = "\""),
"--vanilla",
"--slave",
"-e",
surround(installCmd, with = "\"")
)
system(fullCmd)
return(invisible())
}
答案 2 :(得分:0)
正如GSee所说,问题在于install.packages
运行R CMD INSTALL
,这将启动一个新的R进程,该进程读取Rprofile.site文件,从而导致循环。为防止这种情况,Initialization at Start of an R Session说:
如果您希望子R进程(例如,由R CMD检查和R CMD构建运行的进程)忽略“〜/ .Renviron”或“〜/ .Rprofile”,请将相应的环境变量R_ENVIRON_USER或R_PROFILE_USER设置为(如果可能,在Windows上则不是),请使用“”或不存在的文件名。
为了适应Rprofile.site,可以在调用R_PROFILE
之前将install.packages
设置为空文件或不存在的文件。例如:
if(length(grep("customPackage", installed.packages()[,1]))==0) {
Sys.setenv(R_PROFILE = "/dev/null")
install.packages("customPackage", repos=NULL, type="source")
Sys.unsetenv("R_PROFILE")
}
然后,当R重新启动以安装软件包时,它将读取一个空的Rprofile.site文件,因此邪恶循环被破坏了。
如果对install.packages
的呼叫是在.Rprofile中,则可以用相同的方式设置R_PROFILE_USER
。