如何解决R:从脚本调用函数时的范围错误
我正在用 R 构建一个大型代码库,它通过许多嵌套的用户定义函数使用矢量化。总的来说,这些辅助函数是用它们自己的 R 脚本编写的,用于调试和维护目的。我想在特定环境中获取其中一些脚本的源代码,而不会将函数调用到全局环境中。
我试图使 main.R 文件尽可能干净和易于理解,以便有脚本在幕后完成肮脏的工作。
在下面的示例中,全局环境中填充了 f_foobar
(这是正确的),但是一旦我调用函数 f_foo
,也填充了 f_bar
和 f_foobar
。
是否有一种优雅的方式在临时环境中容纳这些辅助函数(例如 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,虽然我可能能够在没有包的情况下单独确定它们的范围,但当您甚至考虑使用来自另一个,它变得不必要地复杂。包几乎总能解决这个问题。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。