我问这个问题前面,但我仍然无法得到它的工作。 我想在开始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 ),我想用if语句查找软件包将解决问题的贾斯汀的建议。 但是,这似乎只解决这个问题,因为我从CRAN安装软件包,而不是定制的软件包。
在这个问题上的任何帮助,将不胜感激!
我不明白为什么你要做到这一点。 只要有他们自己点.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
也将工作。
编辑
协商后这个答案的SO ,它看起来像你可以做这样的事情在Windows上(假设你已经安装了Rtools ),虽然我没有测试它。
system("Rcmd --vanilla INSTALL customPackage")
您可以使用下面的功能无需重新加载安装包(S) .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())
}
正如GSEE说,问题在于install.packages
运行R CMD INSTALL
,开始一个新的R处理,读取Rprofile.site文件,产生一个循环。 两种方法打破恶循环:
检查R的交互方式运行:
if (interactive() && length(grep("customPackage", installed.packages()[,1]))==0) { install.packages("customPackage", repos=NULL, type="source") }
interactive()
是当FALSE R CMD
正在运行,所以这打破循环。
在设置R_PROFILE
环境变量设置为空或无效值,所以在R会话R CMD
将不会运行你的。 初始化在R对话的开始说:
如果你想“〜/ .Renviron”或“〜/ .Rprofile”,由孩子[R进程(比如那些由R CMD检查和R CMD运行编译),设置相应的环境变量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
以同样的方式。
第一种方法比较简单,而且不需要你担心可能覆盖的现有价值R_PROFILE
。