首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对R6对象使用" with“

对R6对象使用" with“
EN

Stack Overflow用户
提问于 2020-07-22 13:39:57
回答 1查看 83关注 0票数 4

我正在尝试使用像"with“这样的结构来实现更简单(lazier ?)R6对象的操作。考虑以下(最小)示例:

代码语言:javascript
复制
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)

显然,我可以用以下命令绘制对象中的数据

代码语言:javascript
复制
plot(foo$data$x,foo$data$y,col=foo$color,pch=foo$symbol)

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

代码语言:javascript
复制
with(foo,
     plot(data$x,data$y,col=color,pch=symbol)
)

这不起作用:

代码语言:javascript
复制
Error in plot(data$x, data$y, col = color, pch = symbol) : 
  could not find function "plot"

我理解其中的原因(foo表现为一个环境,其中没有定义plot() ),但我找不到解决方案。我猜想,在全局环境中,如何查找函数名?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-22 19:38:15

为什么不简单地添加一个plot方法:

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
parent.env(foo) <- .GlobalEnv
with(foo, plot(data$x, data$y, col=color, pch=symbol))
parent.env(foo) <- emptyenv() # removes the parent environment

这甚至可以被包装在一个函数中,以获得更多的with-like感觉:

代码语言:javascript
复制
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))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63027627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档