假设我正在编写一个R
名为myvals
.
我把它写在文件中zzz.r
:
.__COMMONS__. <- new.env(parent = emptyenv())
.__COMMONS__.$vals <- c('val1', 'val2', 'val3')
然后,如果我在文件中编写此函数vals.r
:
whatvals <- function() {
return(.__COMMONS__.$vals)
}
当我安装我的包(例如,通过devtools
包)并加载它(即,library(myvals)
)时,whatvals()
工作:
[1] "val1" "val2" "val3"
但是,如果那时我写另一个函数:
isval <- function(val = .__COMMONS__.$vals) {
match.arg(val)
}
当我调用它时它不起作用,因为R
找不到.__COMMONS__.
对象。
我认为这取决于函数对形式参数的惰性val
评估match.arg
。
检查match.arg
源代码我发现第一行很有趣:
if (missing(choices)) {
formal.args <- formals(sys.function(sys.parent()))
choices <- eval(formal.args[[deparse(substitute(arg))]])
}
所以我有两个问题要问你:
- 传递给函数的形式参数时如何
.__COMMONS__.
正确评估环境?val
isval
- 有一种更优雅的方式来为包创建全局变量吗?
R
提前致谢。