簡體   English   中英

$ 是一個內部通用的 function,那么 tibble package 是如何擴展它的呢?

[英]$ is an internal generic function, so how did the tibble package extend it?

因為它在Internal Generic Functions 列表中,所以我知道$是一個內部泛型 function。 據我所知,這意味着它不能使用 S3 進行擴展。 盡管如此,眾所周知, $對 tibble 的行為與對數據幀的行為不同,這意味着 tibble package 的開發人員已經完成了我認為不可能的事情。 這是如何實現的? 我試圖在我的 IDE 中獲取$.tibble的代碼,但 tibble tibble::"$".tibble什么也沒返回。

使用以下內容在 R 和任何加載的包中查找示例。 (如果加載了 tibble package ,它也會在其中列出任何 $ 方法,但請注意,tibble 的 class 名稱不是 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"

或者:

一個關鍵的考慮因素是 $ 之后的部分即使您擴展它也不會被評估。

如果第一個參數是 object ( is.object(x)==TRUE ),您可以更改內部 generics 的行為。 小標題是 object。 大多數用戶創建的 S3 類都是。 您之前的問題是您試圖更改矩陣的行為,而矩陣不是“對象”,因此您無法更改此類對象的內部 generics 的調度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM