【发布时间】: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] 影响了整体解决方案。