【问题标题】:Rscript - Using same R-file, The R terminal behaves different compared to RstudioRscript - 使用相同的 R 文件,R 终端的行为与 Rstudio 不同
【发布时间】:2019-04-14 01:33:40
【问题描述】:

问题:使用相同的 R 文件,R 终端的行为与 Rstudio 不同。

当多次在 R 文件下运行时,在 Rstudio 中我得到了正确的行为。

  • 第一次运行 [count=20],其余运行 [count=1]。

当从终端多次运行相同的 R 文件时,使用 [Rscript]:

  • 第一次运行 [count=20],其余运行 [count=20]。

想要的行为:

我需要 R 终端的行为与 R studio 相同,创建值为 [20] 的计数器,其余时间将其设置为值 [1]。

我的环境:

Ubuntu Linux 18.04

R 工作室:1.1.453

终端(Bash 4.4.19,R v.3.4.4)

R 文件的内容:

setwd ("/tmp-r") # Set working directory.

# Set [count] to 20 if [count] does not exists.
# Set [count] to 1 if [count] exists.
if (!exists('count')) {
  count <- 20
} else {
  count <- 1
}

save.image() # Save.

【问题讨论】:

  • 有点明显,但会不会是你的全局环境在 RStudio 中每次连续运行后都被污染了?我的观点是,如果您在 R 脚本的最后包含 rm(list=ls()); gc(reset=TRUE),是否会像在终端中一样使 RStudio 中的剩余运行计数器等于 20?
  • RStudio 为每次执行维护相同的会话。运行 Rscript 会丢失调用之间的会话。您需要在脚本的末尾和开头保存会话 (save.image() / load()) 以保持相同的状态。
  • 我执行了一些测试,在脚本的开头添加了 [load('.Rdata']。它会适应 R 终端中的正确行为。但是,拥有 [load] 会使 Rstudio 始终加载[value=1] 这意味着我必须在第一次运行脚本之前“清理/重置”驻留在 [.RData] 中的计数。这让脚本捕获变量 [count] 不存在,从而创建变量并将其设置为值 [20]。
  • @12b345b6b78 你是正确的,如果添加 [rm(list=ls()] 和 [gc(reset=TRUE)],Rstudio 的行为将与 R 终端相同,这意味着在 Rstudio对于所有脚本运行,该值保持为 [20]。 - 但是,在 [rm(list=ls()] 和 [gc(reset=TRUE)] 下方添加 [load('.RData'],将使Rstudio 行为正确。
  • 我发现即使上述缩小的代码有效,将解决方案应用于扩展脚本也不起作用。在做一些测试时,似乎本地 [.Rprofile] 影响了整体解决方案。

标签: r rstudio rscript


【解决方案1】:

根据 cmets 的输入,我发现了 2 个可以解决问题的问题。对于我作为问题发布的缩小测试脚本和我的扩展脚本。

1) 在开始时添加 [load ('RData')],因为 Rstudio 和 R 终端之间的加载行为不同。每当您在 Rstudio 控制台中发送更改时,Rstudio 都会动态更新全局环境。 R 终端丢失呼叫之间的会话,因此 R 终端需要 R 文件以 [load ('RData')] 开头。

2)为了解决我的扩展脚本,我发现本地[.Rprofile]在脚本末尾有一个[save.image('.RData)]。在 [.Rprofile] 中删除该命令时,它会解决更大的脚本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 2018-07-15
    相关资源
    最近更新 更多