我正在尝试将变量的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软件包变量的正确方法是什么,因此无法重新分配?
编辑:包含错误的错误消息。
主要没有回答您的问题。我同意@ishouldbyaboat的观点,还有更多的事情,一个包含您的简单结构的软件包不会为我产生您看到的错误。您可能正在尝试在代码(!)中其他地方修改正确的位置,或者您在.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
(搜索()路径上的第一个位置)中创建了一个新变量,而不是修改软件包名称space中的变量
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创建true的锁定绑定,直到加载包装为止。之后,绑定还是锁定的。
也许您想在用户的.globalenv中创建一个变量为true,并使其无法更改。当用户的电流.globalenv可见时,必须在加载软件包(或附加)时必须完成此操作,并具有
之类的东西.onAttach <- function(...) {
assign("True", TRUE, .GlobalEnv)
lockBinding("True", .GlobalEnv)
}
这仅将绑定锁定在.globalenv中,因此不能更改它,但不会阻止用户将其删除(例如,使用rm("True")
)。与用户的.globalenv混乱可能还会有助于刺激用户,而不仅仅是进一步的编程议程。