r - 在 R 包中分配锁定变量

标签 r package constants

我正在尝试将变量 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/

相关文章:

java - 错误: could not find or load main class newClass JVM

c - 这个 const 值是如何改变的..?

ruby - 让父类的方法访问子类的常量

r - 如何通过变量将参数传递到 data.table[J()]

c++ - R 中的 LoadLibrary 失败 : %1 is not a valid Win32 application.

r - 如何修改R本地环境中预先存在的函数

java - 用java语言从org.rda导入类

go - 您是否需要使用互斥锁来锁定 const?

r - 如何在r中执行printf?

r - 在 R 中使用 pivot_longer 旋转多组列