情景:我们假设我有一个主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
)不会影响调用者环境。
答案 0 :(得分:1)
有几种方法可以调用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")
答案 1 :(得分:1)
我们创建了recv
new.env
并使用e1 <- new.env()
获取R脚本,sys.source
指定为上面的'e1'
envir