【问题标题】:$ is an internal generic function, so how did the tibble package extend it?$ 是一个内部泛型函数,那么 tibble 包是如何扩展它的呢?
【发布时间】:2021-06-02 14:57:18
【问题描述】:

因为在the list of Internal Generic Functions上,所以我知道$是一个内部泛型函数。 To my knowledge,这意味着它不能使用 S3 进行扩展。尽管如此,众所周知$ 对 tibble 的行为与对数据帧的行为不同,这意味着 tibble 包的开发人员已经完成了我认为不可能的事情。这是如何实现的?我试图在我的 IDE 中获取 $.tibble 的代码,但 tibble::"$".tibble 没有返回任何内容。

【问题讨论】:

  • 您可以找到$.tbl_df* here 的代码,或者使用 tibble:::$.tbl_df。 *"口语“tibble”是指具有tbl_df类的数据框"

标签: r tibble dollar-sign r-s3


【解决方案1】:

如果第一个参数是对象 (is.object(x)==TRUE),您可以更改内部泛型的行为。小标题是一个对象。大多数用户创建的 S3 类都是。您之前的问题是您试图更改矩阵的行为,而矩阵不是“对象”,因此您无法更改此类对象的内部泛型的调度。

【讨论】:

    【解决方案2】:

    使用以下内容在 R 的基础和任何已加载的包中查找示例。 (如果加载了 tibble 包,它还会列出其中的任何 $ 方法,但请注意 tibble 的类名不是 tibble 。)

    methods("$")
    ## [1] $,envRefClass-method        $,refObjectGenerator-method
    ## [3] $.bibentry*                 $.DLLInfo                  
    ## [5] $.package_version           $.person*   
    
    getAnywhere("$.bibentry")         
    ## ...snip...
    
    library(tibble)
    tib <- tibble()
    class(tib)
    ## [1] "tbl_df"     "tbl"        "data.frame"
    getAnywhere("$.tbl_df")
    ## ..snip...
    

    假设您已经安装了相关的软件包,这里还有一些示例:

    zoo:::"$.zoo"
    proto:::"$.proto"
    gsubfn:::"$.fn"
    dyn:::"$.dyn"
    

    或:

    一个关键的考虑因素是 $ 之后的部分即使你扩展它也不会被评估。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-27
      • 2019-12-25
      • 2017-01-16
      • 2015-05-07
      • 2014-12-23
      • 2019-04-26
      • 2012-12-23
      相关资源
      最近更新 更多