【问题标题】:How can I make my R session vanilla?我怎样才能使我的 R 会话香草?
【发布时间】:2012-09-22 21:32:19
【问题描述】:

这是对上一个问题How can I ensure a consistent R environment among different users on the same server?的后续澄清

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

我特别想要以下内容

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

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

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

【问题讨论】:

  • 您能在此处阐明您的预期用例吗?我无法从您的问题中判断出有问题的脚本是从现有 R 会话中运行还是直接从命令行运行。
  • This link 可能是相关的
  • @joran 我希望有问题的脚本能够确保我可以在脚本中控制的标准环境,无论脚本是从命令行运行还是使用 source 在现有的 R 会话;无论哪种方式,我都无法确保它将在原版环境中运行。

标签: r environment


【解决方案1】:

您不能只将当前会话设为普通会话,但您可以像这样从 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") 

【讨论】:

  • 您可能需要将代码放入名为.First 的函数中,并将.First 保存在工作目录中的.RData 文件中。否则,它可能无法运行重启后的代码。 (您还需要在 .First 函数中删除 .Last 以便您稍后可以在不重新启动的情况下退出 R。)请参阅 the link 我在您的 Q 上发表评论
【解决方案2】:

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

#!/path/to/Rscript --vanilla

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

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

【讨论】:

  • +1 -- 我喜欢这种方法比大卫在这里尝试做的要好得多。
  • 我同意 OP 在 cmets 中提出的要求,即无论脚本是使用 Rscript 还是通过 source 运行都无关紧要,这会让事情变得很尴尬。如果您需要确保在 R 启动时设置了环境变量怎么办。例如如果您需要确保设置了TMPDIR,并且您无法控制用户的.Renviron?可以在shebang中完成,还是必须在命令行中设置,如TMPDIR="~/tmp" Rscipt --vanilla
  • 无法与 Rscript 对话,但可以告诉 littler 复制 R 的行为,但在非交互模式下进行。
  • @Gsee,--vanilla--no-save --no-restore --no-site-file --no-init-file --no-environ 的别名。您可以取出--no-site-file 以允许在启动时获取您的Rprofile.site 文件。在该文件中,您可以将TMPDIR 设置为Sys.setenv()。您也可以让脚本本身设置该变量。
  • @flodel,实际上,您不能使用Sys.setenv 更改 TMPDIR,它必须在启动 R 时完成,如我上面的评论中所述。 R --vanilla -q -e 'Sys.setenv(TMPDIR="/home/garrett/tmp"); tempdir()' 给了我“/tmp/RtmpHTXbPp”,但TMPDIR="/home/garrett/tmp" R --vanilla -q -e 'tempdir()' 给了我“/home/garrett/tmp/RtmpzgNXPC”
猜你喜欢
  • 2011-03-19
  • 1970-01-01
  • 2016-11-11
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
  • 2023-01-28
  • 2023-01-30
  • 1970-01-01
相关资源
最近更新 更多