में कस्टम dplyr तरीकों मैं कस्टम summary()
, वस्तुओं एक विशेष वर्ग के लिए है कि print()
तरीकों के साथ एक पैकेज है। इस पैकेज भी डेटा हेरफेर के लिए अद्भुत dplyr
पैकेज का उपयोग करता है - और मैं अपने उन दोनों स्क्रिप्ट अपने पैकेज और dplyr का उपयोग करें कि लिखने के लिए उम्मीद है।को परिभाषित आर पैकेज
एक अवरोध है, जो दूसरों 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)
कि small_cars
के लिए summary
कॉल बस मुझे सामान्य सारांश, नहीं मेरे कस्टम विधि, क्योंकि small_cars
अब dplyr के बाद cars
वर्ग को बरकरार रखे हुए देता है छानने।
मैं क्या करने की कोशिश की
सबसे पहले मैं filter
(filter.cars
) के चारों ओर एक कस्टम विधि लेखन की कोशिश की। यही कारण है कि काम नहीं किया, क्योंकि filter
वास्तव में एक आवरण के आसपास filter_
कि गैर मानक मूल्यांकन के लिए अनुमति देता है।
तो मैं cars
वस्तुओं के लिए एक कस्टम filter_
विधि लिखा था, @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=)?
मैं बस इतना करना चाहता हूं कि आने वाले डीएफ पर कक्षाओं को पकड़ो, डीप्लर को हाथ से हटा दें, फिर ऑब्जेक्ट को उसी क्लासनाम के साथ वापस करें जैसा कि डेलर कॉल से पहले था। कैसे मुझे लगता है कि पूरा करने के लिए मेरी filter_
आवरण बदल सकता हूँ? धन्यवाद!
मुझे आपका आखिरी उदाहरण पसंद है, हालांकि मुझे लगता है कि 'reclass (डेटा, NextMethod()) को' reclass (.data, NextMethod()) ' – Eric
' में बदलना होगा, जबकि यह एक अच्छा कामकाज है, यह बहुत उचित प्रतीत नहीं होता है शुरू करने के लिए कक्षाओं को हटाने के लिए ** dplyr ** के लिए। इस कामकाज का मतलब है कि कस्टम डेटा फ्रेम वर्गों का उपयोग करने वाले प्रत्येक पैकेज को अब प्रत्येक ** dplyr ** क्रिया के लिए विधियों को जोड़ना होगा ... – Deleet
एरिक, मैंने टाइपो को '.data' बनाम 'डेटा' के साथ तय किया है (मैंने नहीं किया जब तक मैंने कोड को लागू करने की कोशिश नहीं की तब तक इसे नोटिस न करें।) – Deleet