我正在尝试将变量 true、false、na 和 null 的 Pascal-Case 版本分配到我的 R 包中。这很容易做到,但我还想锁定绑定(bind)以防止重命名变量。
# 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 包变量以使其无法重新分配的正确方法是什么?
编辑:包含错误的错误消息。
最佳答案
主要是没有回答你的问题。我同意@IShouldByABoat 的观点,即还有更多的事情发生,具有您指出的简单结构的包不会生成您在我看来的错误。可能您正在尝试在代码中的其他位置修改 True (!),或者您的 .Rprofile 或 .RData 文件中可能存在一些干扰性的问题 - 运行您的检查 R --vanilla CMD check
.
例如,函数和符号是在包 namespace 中定义的
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
包 namespace 在加载后被锁定
assign("llply", identity, envir=getNamespace("plyr"))
## Error in assign("llply", identity, envir = getNamespace("plyr")) :
## cannot change value of locked binding for 'llply'
在命令行分配给类似名称的变量会在 .GlobalEnv
(search() 路径上的第一个位置)中创建一个新变量,而不是修改包 namespace 中的变量
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 创建到包加载期间的锁定绑定(bind);之后绑定(bind)无论如何都会被锁定。
也许您想在用户的 .GlobalEnv 中创建一个变量 True,并使其无法更改。这必须在包加载(或附加)时完成,当用户当前的 .GlobalEnv 可见时,类似于
.onAttach <- function(...) {
assign("True", TRUE, .GlobalEnv)
lockBinding("True", .GlobalEnv)
}
这只会锁定 .GlobalEnv 中的绑定(bind),使其无法更改,但不会阻止用户删除它(例如,使用 rm("True")
)。弄乱用户的 .GlobalEnv 还可能会激怒您的用户,而不是进一步推进您的编程议程。
关于r - 在 R 包中分配锁定变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21209230/