对 R6 对象使用 "with"
Use "with" with an R6 object
我正在尝试使用诸如“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)
但是,懒惰(而且因为我有很多这样的对象要绘制,所以copy/paste/edit很耗时并且容易出错)我想做
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()),但我找不到解决方案。我想如何在全局环境中查找函数名称?
为什么不直接添加一个 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))
我正在尝试使用诸如“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)
但是,懒惰(而且因为我有很多这样的对象要绘制,所以copy/paste/edit很耗时并且容易出错)我想做
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()),但我找不到解决方案。我想如何在全局环境中查找函数名称?
为什么不直接添加一个 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))