Управление средой вложенных вызовов к источнику () - PullRequest
3 голосов
/ 05 марта 2019

В этом новом наборе функций я пытаюсь увести drake от глобальной среды пользователя.Это сложно, потому что пользователи могут определять произвольно вложенные файлы кода.Допустим, пользователь определяет файлы 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 выше.
  • Сбор файлов в глобальной среде и последующее ручное копирование в другую среду сопряжено с ошибками замыкания и лексической области видимости, поэтому я настоятельнопредпочитаю держаться подальше от этого.
...