7

这是对上一个问题的后续说明,如何确保同一服务器上不同用户之间的 R 环境一致?

我想从 R 中输入一个“香草”R 会话,例如,类似于我使用命令启动 R 时获得的结果R --vanilla。例如,我想编写一个不受特定用户自定义设置混淆的脚本。

特别是,我想要以下

  • 不读取 R 历史、配置文件或环境文件
  • 不会从以前的会话中重新加载数据或对象

help("vanilla")不返回任何内容,而且我对自定义设置的范围不够熟悉,不知道如何摆脱所有这些设置。

有没有办法进入新的香草环境?(?new.env似乎没有帮助)

4

2 回答 2

5

你不能只是让你当前的会话香草,但你可以像这样从 R 中开始一个新的香草 R 会话

> .Last <- function() system("R --vanilla")
> q("no")

我认为您可能会按原样使用上述方法遇到问题,因为在 R 重新启动后,您的脚本的其余部分将不会执行。使用以下代码,R 将.Last在退出之前运行。  .Last将告诉它在不读取站点文件或环境文件的情况下重新启动,并且不打印启动消息。重新启动后,它将运行您的代码(以及进行一些其他清理)。

wd <- getwd()
setwd(tempdir())
assign(".First", function() {
  #require("yourPackage") 
  file.remove(".RData") # already been loaded
  rm(".Last", pos=.GlobalEnv) #otherwise, won't be able to quit R without it restarting
  setwd(wd)
  ## Add your code here
  message("my code is running.\n")
}, pos=.GlobalEnv)

assign(".Last", function() {
  system("R --no-site-file --no-environ --quiet")
}, pos=.GlobalEnv)
save.image() # so we can load it back when R restarts
q("no") 
于 2012-09-22T02:19:12.633 回答
5

恕我直言,可重复的研究互动会议不能很好地结合在一起。您应该考虑编写从命令行调用的可执行脚本,而不是从打开的交互式会话中调用。在脚本的顶部,添加--vanilla到 shebang:

#!/path/to/Rscript --vanilla

如果您的脚本需要读取输入(参数或选项),您可以使用?commandArgs两个包之一getoptoptparse从命令行解析它们。

如果用户确实需要在交互式会话中完成自己的工作,那么他仍然可以这样做并通过调用您的脚本system():您的脚本仍将使用其自己的 vanilla 会话。传递输入和输出只是一些额外的工作。

于 2012-09-22T12:46:21.773 回答