R-创建一个单独的环境,在其中source()一个R脚本,这样后者就不会影响;呼叫者;环境

R-创建一个单独的环境,在其中source()一个R脚本,这样后者就不会影响;呼叫者;环境,r,pipeline,environment,R,Pipeline,Environment,场景:假设我有一个主管道.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, ... 假设在步骤1.R中发生了一个: rm(list=ls()) 问题: 如何将pipeline.R(调用者)环境与step1.R环境分开? 更具体地说

场景:假设我有一个主
管道.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, ... 
假设在
步骤1.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"
step1$a
#NULL
#rm(list = ls()) actually ran in Test.R
step1$b
#2
注: 您还可以使用
system
运行R脚本。但是,这将在不同的R进程中运行,您将无法从调用脚本的位置检索任何内容

system("Rscript Test.R")

我们创建
new.env

e1 <- new.env()

你可以创造一个环境
e1您是否阅读了
source
的文档,尤其是其
local
参数?看起来它可以做你想做的。(“TRUE、FALSE或环境,确定解析表达式的计算位置。FALSE(默认值)对应于用户的工作区(全局环境),TRUE对应于从中调用源的环境。”)@docendodiscimus I did?发布前的源,并尝试使用
local
参数。它不像我想的那样工作。我想原因是全球环境和“来源环境”是完全相同的。谢谢你的指点。@akrun它是有效的!谢谢,:)。如果你发布一个答案,我可以给你信用。
system("Rscript Test.R")
e1 <- new.env()
sys.source("step1.R", envir=e1)