मैं डेटाफ़्रेम को फ़िल्टर करने के लिए tidyverse का उपयोग कर रहा हूँ और मध्यवर्ती वस्तुओं के आयामों (या nrows) के प्रत्येक चरण पर एक प्रिंट चाहता हूँ। मैंने सोचा कि मैं केवल मैग्रिट से एक टी पाइप ऑपरेटर का उपयोग कर सकता हूं लेकिन यह काम नहीं करता है। मुझे लगता है कि मैं टी पाइप के पीछे की अवधारणा को समझता हूं लेकिन यह नहीं समझ सकता कि क्या गलत है। मैंने बड़े पैमाने पर खोज की लेकिन टी पाइप के बारे में ज्यादा संसाधन नहीं मिला।

मैंने mtcars डेटासेट के साथ एक साधारण उदाहरण बनाया है। इंटरमीडिएट ऑब्जेक्ट्स को प्रिंट करना काम करता है लेकिन अगर मैं मंद() या nrow() से प्रतिस्थापित नहीं करता हूं।

library(tidyverse)
library(magrittr)

mtcars %>% 
    filter(cyl > 4) %T>% dim() %>%
    filter(am == 0) %T>% dim() %>%
    filter(disp >= 200) %>% dim()

मैं निश्चित रूप से इसे आर बेस में लिख सकता हूं लेकिन साफ-सुथरी भावना से चिपके रहना चाहूंगा। मैंने शायद टी पाइप अवधारणा के बारे में कुछ देखा है और किसी भी टिप्पणी/समाधान की सराहना की जाएगी।

संपादित करें: @hrbrmstr और @akrun अच्छे और त्वरित उत्तरों के बाद, मैंने फिर से एक फ़ंक्शन लिखे बिना टी पाइप ऑपरेटर से चिपके रहने की कोशिश की। मुझे नहीं पता कि मुझे पहले खुद जवाब क्यों नहीं मिला, लेकिन यहां वह वाक्यविन्यास है जिसे मैं ढूंढ रहा था:

mtcars %>% filter(cyl > 4) %T>% {print(dim(.))} %>% filter(am == 0) %T>% {print(dim(.))} %>% filter(disp >= 200) %>% {print(dim(.))}

किसी फ़ंक्शन की आवश्यकता के बावजूद, @hrbrmstr समाधान वास्तव में "क्लीन अप" करना आसान है।

3
Carpatorus 9 जिंदा 2018, 14:19

4 जवाब

सबसे बढ़िया उत्तर

@ अक्रुन का विचार काम करता है, लेकिन यह मुहावरेदार नहीं है। tidyverse में अन्य फ़ंक्शन, जैसे print() और glimpse() डेटा पैरामीटर को अदृश्य रूप से लौटाते हैं ताकि उन्हें {} का सहारा लिए बिना पाइप किया जा सके। वे {} आपके द्वारा किए जा रहे अन्वेषण के बाद पाइपों को साफ करना कठिन बना देते हैं।

प्रयत्न:

library(tidyverse)

tidydim <- function(x) {
  print(dim(x))
  invisible(x)
}

mtcars %>%
  filter(cyl > 4) %>%
  tidydim() %>% 
  filter(., am == 0) %>%
  tidydim() %>% 
  filter(., disp >= 200) %>%
  tidydim()

इस तरह आपका "क्लीनअप" (अर्थात अंतरिम कंसोल आउटपुट नहीं बना रहा) tidydim() लाइन या को फ़ंक्शन से print(…) को जल्दी/आसानी से हटा सकता है।

5
hrbrmstr 9 जिंदा 2018, 14:46

पुस्तकालय magrittr से पाइप %T>% केवल इस प्रकार के मामलों के लिए बनाया गया था:

library(magrittr)
library(dplyr)
mtcars %>%
  filter(cyl > 4)     %T>% {print(dim(.))} %>%
  filter(am == 0)     %T>% {print(dim(.))} %>%
  filter(disp >= 200) %T>% {print(dim(.))}

Rstudio में alt + selection का उपयोग करके पढ़ने और संपादित करने में बहुत आसान है यदि आप मेरी पहचान रखते हैं।

यदि आप कोष्ठक पसंद नहीं करते हैं, तो आप यहां @hrbrmstr के फ़ंक्शन का भी उपयोग कर सकते हैं, सिवाय इसके कि आपको अंतिम पंक्ति की आवश्यकता नहीं होगी।


महीनों बाद इसे फिर से देखना @ hrbmst के समाधान को सामान्य बनाने का एक विचार है ताकि आप जो चाहें प्रिंट कर सकें और पाइप के साथ आगे बढ़ने के लिए इनपुट वापस कर सकें।

library(tidyverse)
pprint <- function(.data,.fun,...){
  .fun <- purrr::as_mapper(.fun)
  print(.fun(.data,...))
  invisible(.data)
}

iris %>%
  pprint(~"hello")           %>%
  head(2)                    %>%
  select(-Species)           %>%
  pprint(rowSums,na.rm=TRUE) %>%
  pprint(~rename_all(.[1:2],toupper)) %>%
  pprint(dim)

# [1] "hello"
#    1    2 
# 10.2  9.5 
#   SEPAL.LENGTH SEPAL.WIDTH
# 1          5.1         3.5
# 2          4.9         3.0
# [1] 2 4
3
Moody_Mudskipper 25 जून 2018, 22:37

पैकेज mmpipe के साथ आप नौकरी के लिए एक कस्टम पाइप परिभाषित कर सकते हैं और बहुत कॉम्पैक्ट कोड हो सकता है

library(tidyverse)
library(magrittr)
# devtools::install_github("moodymudskipper/mmpipe")
library(mmpipe)

add_pipe(`%dim>%`,substitute({. <- b; print(dim(.)); cat("\n"); .}, list(b = body)))

mtcars %dim>% 
  filter(cyl > 4) %dim>%
  filter(am == 0) %dim>%
  filter(disp >= 200)
# [1] 21 11
# 
# [1] 16 11
# 
# [1] 14 11
#
#     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
# 1  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
# 2  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
# ... 
3
Moody_Mudskipper 18 नवम्बर 2018, 01:44

हम print का उपयोग {} के भीतर कर सकते हैं

mtcars %>%
   filter(cyl > 4) %>%
   {print(dim(.))
    filter(., am == 0) } %>%
   {print(dim(.))
    filter(., disp >= 200)} %>%
   {print(dim(.))
   .}
#[1] 21 11
#[1] 16 11
#[1] 14 11
#    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#1  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
#2  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
#3  18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
#4  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
#5  16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
#6  17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
#7  15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
#8  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
#9  10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
#10 14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
#11 15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
#12 15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
#13 13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
#14 19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
2
akrun 9 जिंदा 2018, 14:23