क्या eval (पार्स ()) का उपयोग किए बिना पैरामीटर के रूप में स्ट्रिंग के साथ फ़िल्टर करने का कोई तरीका है?

library("dplyr")

subset <- "carb == 4"
subset_df <- mtcars %>% filter(eval(parse(text = subset)))
3
hxalchemy 4 सितंबर 2021, 18:27

3 जवाब

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

1) rlang यदि आप पूछ रहे हैं कि क्या tidyverse में eval/parse करने के लिए समकक्ष हैं, तो हाँ, वहाँ हैं। आपको rlang की भी आवश्यकता होगी जो पहले से ही dplyr द्वारा उपयोग किया जाता है लेकिन dplyr आवश्यक कार्यों को निर्यात नहीं करता है इसलिए इसे लोड करने के लिए लाइब्रेरी स्टेटमेंट का उपयोग करें।

library(dplyr)
library(rlang)

subset <- "carb == 4"
mtcars %>% filter(eval_tidy(parse_expr(subset)))

देना:

                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4

1a) यह भी काम करता है:

mtcars %>% filter(!!parse_quo(subset, .GlobalEnv))

2) sqldf यदि आप eval/parse या इसके किसी प्रत्यक्ष विकल्प का उपयोग किए बिना ऐसा करने का कोई तरीका ढूंढ रहे हैं और इसके लिए tidyverse का उपयोग करने की आवश्यकता नहीं है तो sqldf ऐसा कर सकता है बशर्ते subset में वैध SQL शामिल है जो प्रश्न के मामले में करता है।

library(sqldf)
subset <- "carb == 4"
fn$sqldf("select * from mtcars where $subset")

देना:

    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
1  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
2  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
3  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
4  19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
5  17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
6  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
7  10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
8  14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
9  13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
10 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4

2a) इसे इस प्रकार पाइप के रूप में भी लिखा जा सकता है:

mtcars %>% { fn$sqldf("select * from '.' where $subset") }
5
G. Grothendieck 4 सितंबर 2021, 16:40

यह पदावनत है, लेकिन आप filter_ का उपयोग कर सकते हैं

कोड

mtcars %>%
  filter_("carb == 4")

उत्पादन

                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
2
Vinícius Félix 4 सितंबर 2021, 16:20

यदि हम किसी फ़ंक्शन का उपयोग कर सकते हैं, तो हम इसे बिना उद्धरण के पास कर सकते हैं और इसका मूल्यांकन {{}} में कर सकते हैं, यानी हमें किसी अन्य पैकेज की आवश्यकता नहीं है और न ही कोई eval/parse

library(dplyr)
f1 <- function(data, expr) {
       data %>%
         filter({{expr}})
}

-परिक्षण

> f1(mtcars, carb == 4)
                   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4

इसके अलावा, यदि हम किसी वस्तु से एक स्ट्रिंग बनाने के बजाय, quote से गुजरना चाहते हैं, तो

expr1 <- quote(carb == 4)
f1(mtcars, !!expr1)
                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
-1
akrun 4 सितंबर 2021, 19:38