控制对source()的嵌套调用的环境

时间:2019-03-05 17:42:09

标签: r metaprogramming drake-r-package

this new set of features中,我试图使drake远离用户的全局环境。这具有挑战性,因为用户可以定义任意嵌套的代码文件。假设用户如下定义文件packages.Rfunctions.Rmaster.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.Rfunctions.Rmaster.R中的代码。作为开发人员,我只能控制上面的# Run master.R行。
  • 在全局环境中搜索文件,然后手动复制到其他环境充满了闭包和词法作用域陷阱,因此,我强烈希望不要这样做。

0 个答案:

没有答案