【问题标题】:Inside R6 class definition: 'object not found' (or: how to define 'local' objects in R6 classes)内部 R6 类定义:“找不到对象”(或:如何在 R6 类中定义“本地”对象)
【发布时间】:2021-01-03 18:33:09
【问题描述】:

我想定义一个 R6 类来设置、更新和关闭进度条。对于这 3 个任务,我有 3 个功能。第一个,setup_progressbar(),调用RtxtProgressbar(),它返回一个需要传递给第二个和第三个函数close_progressbar() 的对象(比如pb)。但是后两个函数找不到对象pb

library(R6)
myprogressbar <- R6Class("my_progress_bar",
                         public = list(
                             n = numeric(1),
                             initialize = function(n) {
                                 stopifnot(n >= 1)
                                 self$n <- n
                             },
                             setup_progressbar = function() {
                                 pb <- txtProgressBar(max = self$n)
                             },
                             update_progressbar = function(i) {
                                 setTxtProgressBar(pb, i)
                             },
                             close_progressbar = function () {
                                 close(pb)
                                 cat("\n")
                             }
                         ))
mypb <- myprogressbar$new(10)
mypb$setup_progressbar()
mypb$update_progressbar(3) # Error in setTxtProgressBar(pb, i) : object 'pb' not found

我尝试将pb 添加到self,希望能找到它,但后来我获得了"cannot add bindings to a locked environment"

注意:在我的实际(非最小)示例中,i 被发现/提供/可见,所以这不是一个额外的问题(很可能这只是上述最小工作示例中的一个问题,一旦修复超出'pb' not found 错误)。

【问题讨论】:

  • “不太自然”到底是什么意思?恐怕这就是 R6 对象的工作方式。您可以在adv-r.hadley.nz/r6.html 阅读有关它们的更多信息。目前尚不清楚您的具体要求是什么。
  • 我觉得奇怪的是initialize() 需要所有此类参数(如pb)作为参数(因此需要某种默认值,因此@987654338 不需要提供它@)。可能有很多这样的论点,因此它们都需要成为initialize() 的一部分。感谢您的参考,我阅读了它,但没有涵盖特定情况(在函数之间传递参数),至少我没有看到它。我从homerhanumat.github.io/r-notes/… 看到所有函数都可以访问self,这就是为什么我“强迫”pb 成为其中的一部分。

标签: r r6


【解决方案1】:

以下作品:

library(R6)
myprogressbar <- R6Class("my_progress_bar",
                         public = list(
                             n = numeric(1),
                             pb = NULL, # provide as argument
                             initialize = function(n, pb = NULL) { # provide with default so that $new() doesn't require 'pb'
                                 stopifnot(n >= 1)
                                 self$n <- n
                             },
                             setup_progressbar = function() {
                                 self$pb <- txtProgressBar(max = self$n)
                             },
                             update_progressbar = function(i) {
                                 setTxtProgressBar(self$pb, i)
                             },
                             close_progressbar = function () {
                                 close(self$pb)
                                 cat("\n")
                             }
                         ))

mypb <- myprogressbar$new(10)
mypb$setup_progressbar()
mypb$update_progressbar(3) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多