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)