【问题标题】:How to create a constant inside R package?如何在 R 包中创建一个常量?
【发布时间】: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


【解决方案1】:

最简单和最干净的方法是创建一个函数,例如

K_Q3 <- function() { qnorm(1 - 0.01/2) }

请注意,在 R 中调用函数具有不可忽略的开销。 您应该避免在循环中调用它,或者之前将其复制到局部变量中。

【讨论】:

    【解决方案2】:

    就像您通过将定义函数对象的 .R 文件放置在包目录中的“R”文件夹中来为包创建函数对象一样。您可以简单地将数值 2.575829 分配给变量名——只是不要导出它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      相关资源
      最近更新 更多