场景:假设我有一个主 pipeline.R
脚本如下:
WORKINGDIR="my/master/dir"
setwd(WORKINDIR)
# Step 1
tA = Sys.time()
source("step1.R")
difftime(Sys.time(), tA)
# Add as many steps as desired, ...
假设在 step1.R
中发生:
rm(list=ls())
问题:
如何将 pipeline.R
(调用方)环境与 step1.R
环境分开?
更具体地说,我想在单独的环境中运行 step1.R
,这样其中的任何代码(如 rm
)都不会影响调用者环境。
最佳答案
有几种方法可以调用 R 脚本并运行它。其中之一是 source()
。
Source 评估 r 脚本并在特定环境中执行此操作(如果被调用)。
假设我们有一个 Test.R
脚本:
#Test.R
a <- 1
rm(list = ls())
b <- 2
c <- 3
和全局变量:
a <- 'a'
b <- 'b'
c <- 'c'
现在您想运行此脚本,但在不涉及您从中调用脚本的全局环境的特定环境中。您可以通过创建一个新环境然后调用 source
来做到这一点:
step1 <- new.env(parent = baseenv())
#Working directory set correctly.
source("Test.R", local = step1)
这些是运行后的结果,可以看到,全局环境中的符号并没有被删除。
a
#"a"
b
#"b"
step1$a
#NULL
#rm(list = ls()) actually ran in Test.R
step1$b
#2
注意:
您还可以使用 system
运行 R 脚本。但是,这将在不同的 R 进程中运行,您将无法从调用脚本的位置检索任何内容。
system("Rscript Test.R")
关于R - 创建一个单独的环境,其中 source() 一个 R 脚本,这样后者就不会影响 "caller"环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49818629/