【问题标题】:Use "with" with an R6 object对 R6 对象使用“with”
【发布时间】:2020-07-22 05:39:57
【问题描述】:

我正在尝试使用诸如“with”之类的构造来允许更轻松(更懒惰?)操作 R6 对象。考虑以下(最小)示例:

library(R6)
ToyClass<-R6Class(classname = "ToyClass",
                   public = list(
                     data=data.frame(x=c(1,2,3),y=c(4,5,6)),
                     color = "red",
                     symbol = 16,
                     
                     initialize=function(mult){
                       self$data$x <- self$data * mult
                     }
                   )
)

foo <- ToyClass$new(2)

显然,我可以在我的对象中绘制数据

plot(foo$data$x,foo$data$y,col=foo$color,pch=foo$symbol)

但是,我很懒(因为我有很多这样的对象要绘制,所以复制/粘贴/编辑很耗时并且容易出错)我想做

with(foo,
     plot(data$x,data$y,col=color,pch=symbol)
)

这不起作用:

Error in plot(data$x, data$y, col = color, pch = symbol) : 
  could not find function "plot"

我明白为什么(foo 表现为一个环境,其中 plot() 未定义),但我找不到解决方案。我想如何在全局环境中查找函数名称?

【问题讨论】:

    标签: r r6


    【解决方案1】:

    为什么不直接添加一个plot 方法:

    ToyClass2<-R6Class(classname = "ToyClass2",
                      public = list(
                        data=data.frame(x=c(1,2,3),y=c(4,5,6)),
                        color = "red",
                        symbol = 16,
                        plot = function() {
                          plot(self$data$x,self$data$y,col=self$color,pch=self$symbol)
                        },
                        
                        initialize=function(mult){
                          self$data$x <- self$data * mult
                        }
                      )
    )
    
    foo2 <- ToyClass2$new(2)
    
    plot(foo2)
    

    如果这样不好,另一种方法是设置父环境,如下所示:

    parent.env(foo) <- .GlobalEnv
    with(foo, plot(data$x, data$y, col=color, pch=symbol))
    parent.env(foo) <- emptyenv() # removes the parent environment
    

    这甚至可以封装在一个函数中以获得更像with 的感觉:

    with_global <- function(object, task_expr) {
      task_expr <- substitute(task_expr)
      parent.env(object) <- current_env()
      with(object, eval(task_expr))
    }
    with_global(foo, plot(data$x, data$y, col=color, pch=symbol))
    

    【讨论】:

    • 是的,这是真的,这或多或少是我所做的——但正如你可能猜到的那样,真正的班级是一种复杂的动物,当我试图做一个“非标准”绘图,例如 x/2 vs. y 使用 type = “l”。所以我可以修改我的绘图方法以接受“......”(事实上,它确实如此)但是我必须绘制一个直方图,所以我必须添加一个 hist() 方法......然后我需要另一个。 ....等等。一个永无止境的工作!更复杂的是,init() 方法实际上相当耗时,因此每次重新生成对象的新变体是……很长。
    • 啊对了,我现在能明白一点了。我已经使用父环境使用新的解决方案更新了我的答案。希望对您有所帮助?
    猜你喜欢
    • 2018-05-08
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多