R - 创建一个单独的环境来源()一个R脚本,这样后者不会影响"调用者"环境

时间:2018-04-13 13:52:44

标签: r pipeline environment

情景:我们假设我有一个主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)不会影响调用者环境。

2 个答案:

答案 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