[英]R - Create a separate environment where to source() an R script, such that the latter does not affect the “caller” 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())
問題 :如何從step1.R
環境中分離 pipeline.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")
我們創建new.env
e1 <- new.env()
並使用sys.source
到源的R腳本envir
指定與上述“E1”
sys.source("step1.R", envir=e1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.