1

假设我正在编写一个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

提前致谢。

4

0 回答 0