在 R6 类定义中:“找不到对象”或:如何在 R6 类中定义“本地”对象

问题描述

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

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 错误)。

解决方法

以下工作:

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)