无法为R的包中的全局变量赋值

时间:2013-02-09 07:59:43

标签: r variables package assign

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

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所说。

1 个答案:

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