有没有办法动态强制转换R?
中的对象背景 我正在尝试为summary创建一个函数工厂,它可以根据传递的对象的类返回特定的方法。特别是,这是针对http://adv-r.had.co.nz/Functional-programming.html#lists-of-functions
中的一个问题实现一个与base :: summary()类似的汇总函数,但使用函数列表。修改函数,使其返回一个闭包,使其可以用作函数工厂。
我尝试了一些不正确/不完整的变体,例如
object.list = list(df = data.frame(),fr=factor(), mx = matrix())
summary.new = function(y){
function(x,...){
UseMethod(summary,x)
}
}
summary.new.list = lapply(object.list, summary.new)
我想知道是否有办法动态强制对象 - 比如。(),并使用它来从通用对象返回适当的方法。
summary.new.list函数
> summary.new.list
$df
function (x, ...)
{
UseMethod("summary", x)
}
<environment: 0x108b5edc>
$fr
function (x, ...)
{
UseMethod("summary", x)
}
<environment: 0x108b5de0>
$mx
function (x, ...)
{
UseMethod("summary", x)
}
<environment: 0x108b5ce4>
我想根据对象调用函数,例如。对于数据帧,我想调用summary.new.list$df(data.frame(1:12,3,4))
。虽然现在因为$ df函数仍然是通用的 - 我希望从那里调用基本的summary.data.frame函数而不是UseMethod
答案 0 :(得分:0)
我并不完全理解这个例子的预期用途,但这里有一些可以咀嚼的东西:
summary2 <- function(x){ switch( class(x)[1], "data.frame"= summary.data.frame,
"list"=summary.list ,
"factor"=summary.factor,
"matrix"=summary.matrix,
"numeric" = summary.default) }
summary.new.list = lapply(object.list, summary2)
# Application of that list of functions matched to object classes
> mapply( function(x,y) { do.call(x, list(y) )}, summary.new.list, object.list)
$df
< table of extent 0 x 0 >
$fr
integer(0)
$mx
V1
Mode:logical
NA's:1
您基本上正在重新发明函数的类调度。这个问题要求&#34;强制&#34;但问题似乎并不需要任何强制,至少在我读到它时。