R:从脚本调用函数时出现范围错误

R: Scoping error when calling function from script

我正在用 R 构建一个大型代码库,它通过许多嵌套的用户定义函数使用矢量化。这些辅助函数大体上都是用自己的R脚本编写的,用于调试和维护。我想在特定环境中获取其中一些脚本,而无需将函数调用到全局环境中。

我正在尝试使 main.R 文件尽可能清晰易懂,以便有脚本在幕后执行 脏活

在下面的示例中,全局环境中填充了 f_foobar(这是正确的),而且一旦我调用函数 f_foobar,也会填充 f_foof_bar .

有没有一种优雅的方式在临时环境中放置这些辅助功能(例如f_foof_bar)?

例如,在file_foo.R中:

f_foo <- function() {
  return('a')
}

在file_bar.R中:

f_bar <- function() {
  return('b')
}

在file_foobar.R中:

f_foobar <- function() {
  source('file_foo.R')
  source('file_bar.R')
  
  value_foo <- f_foo()
  value_bar <- f_bar()
  
  c(value_foo, value_bar) %>% return
}

在main.R中:

source('file_foobar.R')

main_result <-f_foobar()

底线:使用source(..., local=TRUE)。来自 ?source:

   local: 'TRUE', 'FALSE' or an environment, determining where the
          parsed expressions are evaluated.  'FALSE' (the default)
          corresponds to the user's workspace (the global environment)
          and 'TRUE' to the environment from which 'source' is called.

之前

ls()
# character(0)
source('file_foobar.R')
main_result <- f_foobar()
main_result
# [1] "a" "b"
ls()
# [1] "f_bar"       "f_foo"       "f_foobar"    "main_result"

之后

ls()
# character(0)
source('file_foobar.R')
main_result <- f_foobar()
main_result
# [1] "a" "b"
ls()
# [1] "f_foobar"    "main_result"

(但实际上,当您谈论 “在特定环境中” 时,这确实说明了使用 R 包。这样做有很多好处,即使你从来没有打算推到 CRAN。我在工作中维护了大约两打包,而不是 CRAN,虽然我可以单独确定它们的范围而不是一个包,但你甚至 考虑 使用一个项目中的另一个项目,它变得不必要地复杂。包几乎总能解决这个问题。)