【问题标题】:Get Object methods R获取对象方法 R
【发布时间】:2016-05-31 08:44:02
【问题描述】:

给定一个任意的 R 对象,如何获取与该对象关联的所有方法?

【问题讨论】:

  • 在 R 中,方法与函数相关联,而不是对象。你越早意识到 R 的 OO 系统越早开始有意义。
  • 如果你用谷歌搜索“find methods r”,前两次点击会带你到相应的帮助页面文件。 :P
  • @hadley 但不都是函数对象吗?
  • 是的,但这不是重点。你可以给一个函数一个类,但是方法仍然是泛型函数的方法而不是函数对象。

标签: r


【解决方案1】:

我能想到的最接近的是methods(如果是 S3 对象/函数,List all available methods for an S3 generic function, or all methods for a class.)或showMethods(如果是 S4)。

例如:

> A <- matrix(runif(10))
> B <- methods(class=class(A))
> B
 [1] anyDuplicated.matrix as.data.frame.matrix as.raster.matrix*   
 [4] boxplot.matrix       determinant.matrix   duplicated.matrix   
 [7] edit.matrix*         head.matrix          isSymmetric.matrix  
[10] relist.matrix*       subset.matrix        summary.matrix      
[13] tail.matrix          unique.matrix       

   Non-visible functions are asterisked
> attr(B,'info')
                     visible                from
anyDuplicated.matrix    TRUE        package:base
as.data.frame.matrix    TRUE        package:base
as.raster.matrix       FALSE registered S3method
boxplot.matrix          TRUE    package:graphics
determinant.matrix      TRUE        package:base
duplicated.matrix       TRUE        package:base
edit.matrix            FALSE registered S3method
head.matrix             TRUE       package:utils
isSymmetric.matrix      TRUE        package:base
relist.matrix          FALSE registered S3method
subset.matrix           TRUE        package:base
summary.matrix          TRUE        package:base
tail.matrix             TRUE       package:utils
unique.matrix           TRUE        package:base

或者对于一个函数:

> methods(summary)
 [1] summary.aov             summary.aovlist         summary.aspell*        
 [4] summary.connection      summary.data.frame      summary.Date           
 [7] summary.default         summary.ecdf*           summary.factor         
[10] summary.glm             summary.infl            summary.lm             
[13] summary.loess*          summary.manova          summary.matrix         
[16] summary.mlm             summary.nls*            summary.packageStatus* 
[19] summary.PDF_Dictionary* summary.PDF_Stream*     summary.POSIXct        
[22] summary.POSIXlt         summary.ppr*            summary.prcomp*        
[25] summary.princomp*       summary.srcfile         summary.srcref         
[28] summary.stepfun         summary.stl*            summary.table          
[31] summary.tukeysmooth*   

   Non-visible functions are asterisked

?Methods 也可能被证明是有用的阅读。

【讨论】:

    【解决方案2】:

    使用class 恢复 R 对象的类。在典型的 R 语言中,对象没有与之关联的方法。对象的类决定了将应用于它的函数方法。为了确定哪些函数具有与给定类关联的方法,您需要测试所有可用函数以查看是否存在特定于类的方法。即使这样,泛型函数也会在大多数情况下尝试使用“默认”方法。

    与通用 S3 函数关联的一些方法显示为 methods。使用showMethods 恢复 S4 函数的方法。因此,对于大多数人所说的“对象”,您的问题没有意义,但如果您在通用术语“对象”下包含函数(这在技术上是公平的),那么我已经回答了。

    showMethods(classes="data.frame")
    methods(class="data.frame")
    

    然后有一组方法可能被称为“隐式”,尽管它们的 R 名称是“groupGeneric”

     ?groupGeneric
    
     methods("Math") # These are "add-on" methods to the primitive Math functions
     [1] Math.data.frame  Math.Date        Math.dates*      Math.difftime    Math.factor     
     [6] Math.mChoice     Math.polynomial* Math.POSIXt      Math.ratetable*  Math.Surv*      
    [11] Math.times*     
    
       Non-visible functions are asterisked
     ?"+"
    
     methods("Ops")  # The binary operators such as "+", "-", "/"
     [1] Ops.data.frame      Ops.Date            Ops.dates*          Ops.difftime        Ops.factor         
     [6] Ops.findFn          Ops.mChoice         Ops.numeric_version Ops.ordered         Ops.polynomial*    
    [11] Ops.POSIXt          Ops.raster*         Ops.ratetable*      Ops.Surv*           Ops.times*         
    [16] Ops.ts*             Ops.unit*           Ops.yearmon*        Ops.yearqtr*        Ops.zoo*           
    
       Non-visible functions are asterisked
    

    即便如此,您还没有真正显示 Math 或 Ops 系列的成员,但您会在 ?groupGeneric 的帮助页面上看到它们。您看不到 Ops.numeric。一个较低级别的视图由以下人员提供:

     .Primitive("+")
    # function (e1, e2)  .Primitive("+")
    

    如果提供了错误的类参数,这些将引发错误。

    【讨论】:

      【解决方案3】:

      一些包定义的函数不是方法,但它们仍然打算与特定类一起使用。例如,library(igraph) 定义了函数radius(_),该函数旨在用于igraph 类中的对象。由于这些函数不是方法,methods(_)showMethods(_) 不会显示它们。

      在这种情况下,lsf.str(_) 会很有帮助。例如:

      lsf.str("package:igraph")
      

      包括行:

      radius : function (graph, mode = c("all", "out", "in", "total"))  
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-16
        • 2013-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-02
        • 2011-10-14
        相关资源
        最近更新 更多