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

标签 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)都不会影响调用者环境。

最佳答案

有几种方法可以调用 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")

关于R - 创建一个单独的环境,其中 source() 一个 R 脚本,这样后者就不会影响 "caller"环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49818629/

相关文章:

R:通过具有重叠容差的标准删除间隔

r - 在 R Shiny 服务器上保存临时文件

powershell - 如何直接通过管道传输到 Copy-Item 而不是在 ForEach-Object 中

r - lapply 循环内的函数环境

python - Conda列表显示python包但出现错误 'module not found'

python - 导入 rpy2.objects 出现错误 : unable to initialize the JiT

Powershell - 自定义模块的输出不可用

php - docker |管道失败 ubuntu 源列表

r - R Shiny 中的环境

data.table 中的行操作