【问题标题】:How to create R functions with private variables?如何使用私有变量创建 R 函数?
【发布时间】:2026-02-23 04:10:02
【问题描述】:

如何创建一组都访问同一个私有变量的 R 函数?

假设我想创建readSetting(key)writeSetting(key,value) 函数,它们都在同一个隐藏列表settings 上运行。如果我这样尝试...

local( {
  settings <- list()
  readSetting <<- function ( key ) settings[[key]]
  writeSetting <<- function ( key, value ) settings[[key]] = value
} )

...然后readSettingwriteSettinglocal 调用之外不可见。如果我想让它们在那里可见,我必须先分配

readSetting <- writeSetting <- NULL

local 通话之外。必须有更好的方法,因为如果我必须以两种不同的方式说出哪些变量是公共的,我的代码不是 DRY。

(本文的背景是我正在开发一个R包,这段代码将在一个辅助文件中,通过source加载到主文件中。)

这个问题与How to limit the scope of the variables used in a script? 有关,但那里的答案并不能解决我的问题。

【问题讨论】:

  • 你可以看看knitr如何处理它的选项(这似乎类似于base::options)作为一个例子。
  • 也许我有点慢,@Gregor,但我看不到连接。
  • 这是我能想到的唯一一个具有经常修改的全局选项的包。如果knitr 没有导出opts_chunk,则所有块选项都可能不可见(或多或少)。
  • 另外“此代码将位于辅助文件中,通过源代码加载到主文件中” 对我来说听起来不像是好的 R 包实践。我没有开发很多包,所以我可能是错的,但这听起来像它会更好地实现为未导出的数据对象。

标签: r variables scope private


【解决方案1】:

您可以使用 R6Class 包和以下非常粗略的代码来模拟类似的东西:

Privates <- R6Class("Privates",
                public=list(
                     readSetting = function(key) {
                       private$settings[[key]]
                     },
                     writeSetting = function(key,value) {
                       private$settings[[key]] <<- value
                     }
                   ),
                private=list(
                  settings = list()
                )
)
a <- Privates$new()
a$writeSetting("a",4)
a$readSetting("a")

直接读取 o 设置a$setting 将不起作用。

【讨论】:

  • 看起来不错。您还可以使用一些基本 R 函数所做的环境,其中一些是显式的。我在考虑stepfunecdf,但我怀疑这种方法更健壮,因为您应该能够导出 R6Classes。
  • 这似乎触及了我想要做的事情的核心,但我不确定我是否要为这件事导入整个类包。
  • 这一切都取决于您想要实现的目标以及为什么或您真的需要它私有?