1

我正在构建一个具有全局变量的包,代码如下:

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'

我怎么解决这个问题?

编辑:

  1. at无法更改,因为加载包后环境是密封的。但是可以调用get.at()自定义函数.onLoad.onAttach成功调用。

  2. 正如@daniel 所说,另一个解决方案是创建一个属于内部环境的变量。

4

1 回答 1

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 核心团队的推荐方式”。

于 2013-02-09T08:18:40.613 回答