定製dplyr方法我有定製summary()
,print()
方法具有特定類的對象包。該軟件包還使用美妙的dplyr
軟件包進行數據操作 - 我希望我的用戶能夠編寫同時使用我的軟件包和dplyr的腳本。定義中的R包
的一個障礙,它已被他人here和here注意的是,dplyr動詞不保留自定義類 - 這意味着一個ungroup
命令可以剝奪他們的自定義類的我data.frames,從而搞砸方法派出summary
等
哈德利說,「這樣做正確的是你 - 你需要定義你的類能夠正確還原所有類和屬性各dplyr方法的方法」,我試圖採取advice - 但我無法弄清楚如何正確包裝dplyr動詞。
下面是一個簡單的玩具例子。比方說,我已經定義了一個cars
課,我有一個自定義summary
。
這個作品
library(tidyverse)
class(mtcars) <- c('cars', class(mtcars))
summary.cars <- function(x, ...) {
#gather some summary stats
df_dim <- dim(x)
quantile_sum <- map(mtcars, quantile)
cat("A cars object with:\n")
cat(df_dim[[1]], 'rows and ', df_dim[[2]], 'columns.\n')
print(quantile_sum)
}
summary(mtcars)
這裏的問題
small_cars <- mtcars %>% filter(cyl < 6)
summary(small_cars)
class(small_cars)
是summary
呼籲small_cars
只是給了我一般總結,而不是我的自定義的方法,因爲small_cars
不再保留dplyr後cars
類過濾。
我試過
首先,我試着寫左右filter
(filter.cars
)的自定義方法。沒有工作,因爲filter
實際上是一個包裝周圍filter_
,允許非標評價。
所以我寫了一個自定義的filter_
方法cars
對象,試圖實施@jwdink的advice
filter_.cars <- function(df, ...) {
old_classes <- class(df)
out <- dplyr::filter_(df, ...)
new_classes <- class(out)
class(out) <- c(new_classes, old_classes) %>% unique()
out
}
這並不工作 - 我得到一個無限遞歸錯誤:
Error: evaluation nested too deeply: infinite recursion/options(expressions=)?
Error during wrapup: evaluation nested too deeply: infinite recursion/options(expressions=)?
所有我想要做的就是搶在進入DF類,移交給dplyr,然後用相同的類名返回對象,因爲它的dplyr呼叫前了。 如何更改我的filter_
包裝來實現這一目標?謝謝!
我喜歡你的最後一個例子,雖然我認爲'reclass(data,NextMethod())'需要改爲'reclass(.data,NextMethod())' – Eric
雖然這是一個很好的解決方法,但它看起來不太合理爲** dplyr **刪除開始的類。這種解決方法意味着每個使用自定義數據框類的軟件包現在都必須爲每個** dplyr **動詞添加方法... – Deleet
Eric,我用'.data'和'data'修復了錯字(我沒有直到我試圖自己實現代碼時纔會注意到它。) – Deleet