【发布时间】:2015-10-07 14:29:03
【问题描述】:
如何在R包内创建常量变量,其值不能改变?换句话说,我们如何在包环境中锁定名称-值对?
示例:在我的包中,我在不同函数的循环中使用正态分布的分位数,并且不想一直计算(或创建)它。
我试过k_q3 <- qnorm(1 - 0.01/2); lockBinding("k_q3", environment()),但它不起作用。
更新:上面的方法实际上是可行的。一个人不能改变 k_q3 既不是内部包装,也不是外部。
【问题讨论】:
-
您遇到错误了吗?我尝试了您的方法并更改了变量,得到了这个:
Error: cannot change value of locked binding for 'k_q3' -
不。我还将这个变量导出到 NAMESPACE,每当我尝试通过
mypackagename::k_q1 <- 2更改它时,我都会得到以下Error in mypackagename::k_q1 <- 2 : object 'mypackagename' not found -
实际上它正在工作:) 我添加了一个函数,它试图更改
k_q1的值,但它失败了。这是代码:#' @export mmm <- function(x) { k_q1 <- x } -
在构建包时,您可以使用命令
devtools::use_data(constants, pkg, internal = TRUE),保存变量constants,同时确保它对包用户不可用。函数use_data支持保存多个常量,它的第一个参数...。更多信息可以在here找到。 -
我认为具有私有变量的
R6类可以对包的用户起到类似于常量的作用,尽管包的内部代码仍然可以修改私有变量。
标签: r package constants environment