如何解决$ 是一个内部泛型函数,那么tibble 包是如何扩展它的呢?
因为它在 the list of Internal Generic Functions 上,所以我知道 $
是一个内部通用函数。 To my knowledge,这意味着它不能使用 S3 扩展。尽管如此,众所周知,$
对 tibble 的行为与它对数据帧的行为不同,这意味着 tibble 包的开发者已经完成了我认为不可能的事情。这是如何实现的?我试图在我的 IDE 中获取 $.tibble
的代码,但 tibble::"$".tibble
什么也没返回。
解决方法
使用以下内容在 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"
或:
- https://github.com/cran/zoo/blob/master/R/zoo.R
- https://github.com/hadley/proto/blob/master/R/proto.R
- https://github.com/cran/gsubfn/blob/master/R/fn.R
- https://github.com/cran/dyn/blob/master/R/dyn.R
一个关键的考虑因素是 $ 后面的部分即使你扩展它也不会被评估。
,如果第一个参数是对象 (is.object(x)==TRUE
),您可以更改内部泛型的行为。 tibble 是一个对象。大多数用户创建的 S3 类都是。您之前的问题是您试图更改矩阵的行为,而矩阵不是“对象”,因此您无法更改此类对象的内部泛型的调度。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。