我需要允许用户使用多个类之一创建一个对象。该对象需要进一步分析,因此将被传递给下游的众多S3方法之一。
我的想法是让他们在创建函数调用中将类作为字符串提供,但我不确定使用useMethod选择正确的S3方法的最佳方法,因为将使用不同的对象创建不同的对象算法
create_thing()函数将返回一个具有类集的对象,因此graph_thing()和report_thing()将获取create_thing()的输出并有一个要使用的类。
create_thing <- function(model = 'strange', foo, bar){
tmp <- ""
class(tmp)<-model
UseMethod("create_thing", tmp)
}
create_thing.strange <- function(model, foo = 1, bar = 2){
## stuff
print("strange")
return(structure(list(data=runif(5)), class = c("list", "strange")))
}
create_thing.normal <- function(model, foo = 3, bar = 4){
## stuff
print("normal")
return(structure(list(data=rnorm(5)), class = c("list", "normal")))
}
graph_thing <- function(athing){
UseMethod("graph_thing")
}
graph_thing.normal <- function(athing){
print("normal")
plot(athing$data)
}
graph_thing.strange <- function(athing){
print("strange")
plot(athing$data)
}
report_thing <- function(athing){
UseMethod("report_thing")
}
report_thing.normal <- function(athing){
print("normal")
print(mean(athing$data))
}
report_thing.strange <- function(athing){
print("strange")
print(median(athing$data))
}
答案 0 :(得分:1)
UseMethod
函数查找调用堆栈以查看传递给原始函数的内容。创建的任何修改或新对象都不会影响调度的工作方式。
如果您使用create_thing
函数来初始化对象,那么您应该为它创建一个单独的泛型函数
create_thing <- function(model = 'strange', foo, bar){
tmp <- ""
class(tmp)<-model
init_thing(tmp, foo, bar)
}
init_thing <- function(model, foo=0, bar=0) {
UseMethod("init_thing")
}
init_thing.strange <- function(model, foo = 1, bar = 2){
## stuff
print("strange")
return(structure(list(data=runif(5)), class = c("list", "strange")))
}
init_thing.normal <- function(model, foo = 3, bar = 4){
## stuff
print("normal")
return(structure(list(data=rnorm(5)), class = c("list", "normal")))
}