【问题标题】:Assigning a locked variable in an R package在 R 包中分配锁定变量
【发布时间】:2014-01-18 20:06:32
【问题描述】:

我正在尝试将变量 true、false、na 和 null 的 Pascal-Case 版本分配到我的 R 包中。这很容易做到,但我也想锁定绑定以防止重命名变量。

# An anti-example from the base libraries
F <- TRUE
T <- FALSE

T && T
FALSE

我不知道如何锁定包中的变量以防止进一步修改。跟随模拟包不起作用

# test.R
True <- TRUE
lockBinding('True', environment())

#DESCRIPTION
Collate:
    'test.R'

运行 R CMD 检查时出现以下错误:

Error in eval(expr, envir, enclos) : 
    cannot change value of locked binding for 'True'

锁定 R 包变量以使其无法重新分配的正确方法是什么?

编辑:包含错误的错误信息。

【问题讨论】:

  • 你没有告诉我们整个故事。令牌Na 未在 R 中保留,因此您必须创建它或在它不存在时尝试访问它......或其他东西。错误消息不是指“真”(也不是 R 中的保留字。)
  • FWIW,一旦加载包,绑定就会被锁定,所以你只会阻止包内的代码在初始安装和加载期间修改绑定。这真的是你的目标吗?
  • @MartinMorgan 我不确定这是不是真的。例如,要求(plyr); llply
  • @IShouldBuyABoat 考虑到我收到的错误消息,我倾向于同意(顺便修复了消息);错误很奇怪。我没有在其他地方分配变量,它是 collat​​e 字段中的第一个函数,所以如果有一个细节我会遗漏,我不确定它是什么。

标签: r package constants


【解决方案1】:

主要是不回答你的问题。我同意@IShouldByABoat 的观点,还有更多事情要做,一个结构简单的包不会产生你看到的错误。可能您正尝试在代码中的其他地方修改 True (!),或者您的 .Rprofile 或 .RData 文件中存在一些干扰 - 以 R --vanilla CMD check 运行您的检查。

函数和符号是在包名称空间中定义的,例如

library(plyr)             ## load package name space, attach to the search() path
getNamespace(plyr)        ## package name space
ls(getNamespace(plyr))    ## symbols defined in the name space
plyr::llply               ## definition of `llply` in the name space

包名空间在加载后被锁定

assign("llply", identity, envir=getNamespace("plyr"))
## Error in assign("llply", identity, envir = getNamespace("plyr")) : 
##   cannot change value of locked binding for 'llply'

在命令行中分配给类似名称的变量会在.GlobalEnv(search() 路径上的第一个位置)中创建一个新变量,而不是修改包名称空间中的变量

ls()               ## no symbol 'llply' in .GlobalEnv
llply <- identity  ## new symbol 'llply' in .GlobalEnv
llply(10)          ## use first llply function in search(), i.e., in .GlobalEnv
plyr::llply(10)    ## circumvent search path and use llply from plyr name space

所以代码如

True <- TRUE
lockBinding("True", environment())

仅添加从 True 创建到加载包的锁定绑定;之后绑定无论如何都会被锁定。

也许您想在用户的 .GlobalEnv 中创建一个变量 True,并使其无法更改。这必须在包被加载(或附加)时完成,当用户当前的 .GlobalEnv 可见时,类似于

.onAttach <- function(...) {
    assign("True", TRUE, .GlobalEnv)
    lockBinding("True", .GlobalEnv)
}

这只会锁定 .GlobalEnv 中的绑定,因此无法更改,但不会阻止用户删除它(例如,使用 rm("True"))。与您用户的 .GlobalEnv 混淆可能还会激怒您的用户,而不是进一步推进您的编程议程。

【讨论】:

  • 帖子+1,最后一句话想+10,但不能。
猜你喜欢
  • 2011-12-09
  • 2018-06-22
  • 2023-03-08
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多