【问题标题】:dynamic class coercion in RR中的动态类强制
【发布时间】:2017-05-22 12:32:21
【问题描述】:

有没有办法在 R 中动态强制对象?

背景 我正在尝试为摘要创建一个函数工厂,它可以根据传递的对象的类返回特定的方法。特别是针对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)

我想知道是否有一种方法可以动态强制一个对象——比如 as.() 并使用它从通用对象返回适当的方法。

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

【问题讨论】:

  • 这看起来不像您引用的材料中的示例。构造带有参数y 的函数然后不在函数体中使用y 也是没有意义的。
  • @42- 代码是我的示例,不是来自材料。而且我不需要在第一级使用变量 y,因为它仅用于创建闭包。实际的工作函数在列表summary.new.list 中。我还添加了我打算如何使用该列表,希望它能增加一些清晰度

标签: r r-s3


【解决方案1】:

我不完全理解这个示例的预期目的,但这里有一些值得细细琢磨的地方:

 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   

您基本上是在重新发明函数的类调度。该问题要求“强制”,但问题似乎不需要任何强制,至少在我阅读时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    相关资源
    最近更新 更多