R:从脚本调用函数时出现范围错误
R: Scoping error when calling function from script
我正在用 R 构建一个大型代码库,它通过许多嵌套的用户定义函数使用矢量化。这些辅助函数大体上都是用自己的R脚本编写的,用于调试和维护。我想在特定环境中获取其中一些脚本,而无需将函数调用到全局环境中。
我正在尝试使 main.R 文件尽可能清晰易懂,以便有脚本在幕后执行 脏活。
在下面的示例中,全局环境中填充了 f_foobar
(这是正确的),而且一旦我调用函数 f_foobar
,也会填充 f_foo
和 f_bar
.
有没有一种优雅的方式在临时环境中放置这些辅助功能(例如f_foo
和f_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,虽然我可以单独确定它们的范围而不是一个包,但你甚至 考虑 使用一个项目中的另一个项目,它变得不必要地复杂。包几乎总能解决这个问题。)
我正在用 R 构建一个大型代码库,它通过许多嵌套的用户定义函数使用矢量化。这些辅助函数大体上都是用自己的R脚本编写的,用于调试和维护。我想在特定环境中获取其中一些脚本,而无需将函数调用到全局环境中。
我正在尝试使 main.R 文件尽可能清晰易懂,以便有脚本在幕后执行 脏活。
在下面的示例中,全局环境中填充了 f_foobar
(这是正确的),而且一旦我调用函数 f_foobar
,也会填充 f_foo
和 f_bar
.
有没有一种优雅的方式在临时环境中放置这些辅助功能(例如f_foo
和f_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,虽然我可以单独确定它们的范围而不是一个包,但你甚至 考虑 使用一个项目中的另一个项目,它变得不必要地复杂。包几乎总能解决这个问题。)