将方法作为字符串传递

时间:2016-05-10 22:45:19

标签: r

我需要允许用户使用多个类之一创建一个对象。该对象需要进一步分析,因此将被传递给下游的众多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))
}

1 个答案:

答案 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")))
}