我正在构建一个包含全局变量的包,代码如下:
at <- NA
get.at <- function() {
if (is.na(at)) {
at <<- 1
}
at
}
但是当我拨打get.at()
时,会引发错误:
Error in get.at() : cannot change value of locked binding for 'at'
我该如何解决这个问题?
编辑:
at
,因为加载包后环境已被密封。但是,可以成功调用自定义函数get.at()
或.onLoad
中的.onAttach
。
另一个解决方案是创建属于内部环境的变量,如@daniel所说。
答案 0 :(得分:1)
尝试查看?unlockBinding
,也许您首先必须在包中打开绑定,然后才能更改值。这是R中帮助文件的一部分,可能对您有所帮助:
e <- new.env()
assign("x", 1, envir = e)
get("x", envir = e)
lockBinding("x", e)
try(assign("x", 2, envir = e)) # error
unlockBinding("x", e)
assign("x", 2, envir = e)
get("x", envir = e)
编辑:
我不确定这是否真的可以在包中正常运行。一种可能的解决方案是创建另一个R源文件zzz.R
,并在那里创建一个变量所在的环境并为其分配默认值。
zzz.R
:
.PkgEnv <- new.env()
assign("at",NA, envir = .PkgEnv)
然后您可以通过这种方式更改代码,即始终从您感兴趣的环境访问变量:
get.at <- function(){
if(is.na(get("at",envir=.PkgEnv))){
assign("at",1,envir=.PkgEnv)
}
get("at",envir=.PkgEnv)
}
我刚刚在一个测试包中对它进行了测试,结果很好,但我不确定这是否是“R核心团队的推荐方式”。