繁体   English   中英

与 R6 object 一起使用“with”

[英]Use “with” with an R6 object

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

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 中的数据 object

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

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

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() 未定义),但我找不到解决方案。 我想如何在全球环境中查找 function 名称?

为什么不直接添加一个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

这甚至可以包含在 function 中, 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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM