在R软件包中分配锁定变量



我正在尝试将变量的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混乱可能还会有助于刺激用户,而不仅仅是进一步的编程议程。

最新更新