从RProfile.site文件安装软件包

时间:2012-07-17 21:00:24

标签: r rprofile

我之前问了这个问题,但仍然无法让它运转起来。我正在尝试在启动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安装的软件包而不是自定义软件包的问题。

非常感谢任何有关此事的帮助!

3 个答案:

答案 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