在这组新功能中,我试图避开drake
用户的全局环境。这是具有挑战性的,因为用户可以定义任意嵌套的代码文件。假设用户定义了 files packages.R
、functions.R
和master.R
,如下所示。
writeLines("library(MASS)", "packages.R")
writeLines("util <- function() {'utility'}", "functions.R")
writeLines(c("source('packages.R')", "source('functions.R')"), "master.R")
cat(readLines("packages.R"), sep = "\n")
#> library(MASS)
cat(readLines("functions.R"), sep = "\n")
#> util <- function() {'utility'}
cat(readLines("master.R"), sep = "\n")
#> source('packages.R')
#> source('functions.R')
作为开发人员,我正在寻找一种运行方式,以master.R
使新数据对象都不会出现在全局环境中。我最初的尝试没有成功。
当前行为
envir <- new.env(parent = globalenv())
source("master.R", local = envir)
ls(envir)
#> character(0)
ls()
#> [1] "envir" "util"
期望的结果
envir <- new.env(parent = globalenv())
# Run master.R
ls(envir)
#> [1] "util"
ls()
#> [1] "envir"
约束
- 我不允许修改
packages.R
,functions.R
或master.R
. 作为开发人员,我只能控制# Run master.R
上面的行。 - 在全局环境中获取文件,然后手动复制到不同的环境中充满了闭包和词法范围的陷阱,所以我强烈希望远离这种情况。