【问题标题】:could not assign value to global variable in package of R无法为 R 包中的全局变量赋值
【发布时间】:2013-02-09 07:59:43
【问题描述】:

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

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 无法更改,因为加载包后环境已密封。但是可以在自定义函数.onLoad.onAttach中调用get.at()成功。

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

【问题讨论】:

  • 您的代码在复制粘贴到 R 控制台时可以正常工作
  • 是的,它在控制台中工作。但是当我将它构建到一个包中并调用该函数时,它会引发错误。

标签: r variables package assign


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

【讨论】:

  • tks @daniel,它似乎工作。但是为什么我的代码失败了?我尝试用unlockBinding("at", as.environment("Package:RLibTest"))解锁包环境,结果是一样的。那么变量at所处的确切环境是什么?
  • 对不起,我只是想知道是否有可能在加载包后解锁绑定。我将编辑我之前的帖子,并提供一个替代解决方案,即创建一个全局变量所在的新包环境。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 2012-09-17
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多