首页 > 解决方案 > $ 是一个内部泛型函数,那么 tibble 包是如何扩展它的呢?

问题描述

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

标签: rtibbledollar-signr-s3

解决方案


使用以下内容在 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"

或者:

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


推荐阅读