簡體   English   中英

R - 創建一個單獨的環境來源()一個R腳本,這樣后者不會影響“調用者”環境

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM