从RProfile.site文件安装包(Installing packages from RProf

2019-09-19 16:05发布

我问这个问题前面,但我仍然无法得到它的工作。 我想在开始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安装软件包,而不是定制的软件包。

在这个问题上的任何帮助,将不胜感激!

Answer 1:

我不明白为什么你要做到这一点。 只要有他们自己点.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")


Answer 2:

您可以使用下面的功能无需重新加载安装包(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())
}


Answer 3:

正如GSEE说,问题在于install.packages运行R CMD INSTALL ,开始一个新的R处理,读取Rprofile.site文件,产生一个循环。 两种方法打破恶循环:

  1. 检查R的交互方式运行:

     if (interactive() && length(grep("customPackage", installed.packages()[,1]))==0) { install.packages("customPackage", repos=NULL, type="source") } 

    interactive()是当FALSE R CMD正在运行,所以这打破循环。

  2. 在设置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



文章来源: Installing packages from RProfile.site file
标签: r rprofile