фильтр больше (или ниже), чем в качестве параметра функции - PullRequest
3 голосов
/ 06 мая 2019

У меня есть такой код dplyr

data <- load_data(country = "us") %>%
    filter(number > 1) 

Я бы хотел создать функцию из этого вызова вот так

test <- function(country_code = "us") {
   data <- load_data(country = country_code) %>%
        filter(number > 1)
}

Но я бы хотел добавить четный параметр для этого числового фильтра. Обычно я делаю это так же, как код страны. Но я хочу иметь возможность звонить даже на номер = 0 или номер меньше 1 и т. Д.

Итак, вопрос в том, как обращаться с этим символом терки (меньше / равно) в вызове функции?

Должно быть что-то вроде test <- function(country_code = "us", number > 0) или

test <- function(country_code = "us", number <= -10)

Ответы [ 3 ]

8 голосов
/ 06 мая 2019

Вы можете передать дополнительные параметры функции фильтра, используя обозначение ....

Пример:

test <- function(path, country_code = "us", ...) {
   read_csv(path) %>%
        filter(...)
}

test('somepath', country_code = "us", number <= -10)
0 голосов
/ 06 мая 2019

С помощью tidyverse мы можем получить выражение с помощью enexpr и затем оценить (!!)

test <- function(path, country_code = "us", expr1) {

     expr1 <- rlang::enexpr(expr1)
     load_data(country = country_code) %>%
         filter(!! expr1)

    }

Используя воспроизводимый пример

test <- function(data,  expr1) {
   expr1 <- rlang::enexpr(expr1)
   data %>%
       filter(!! expr1)


}

test(mtcars, vs == 1)
#    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#1  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
#2  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
#3  18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
#4  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
#5  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
#6  19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
#7  17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
#8  32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
#9  30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
#10 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
#11 21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
#12 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
#13 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
#14 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
0 голосов
/ 06 мая 2019

Мне понравился ответ @JohannesNE.Вот еще один вариант, использующий match.fun и rlang::sym

library(dplyr)
library(rlang)

test <- function(country_code = "us", op, col, value) {
    load_data(country = country_code) %>%
      filter(match.fun(op)(!!sym(col), value))
}

Здесь мы передаем оператор, столбец и значение для сравнения отдельно в функции.

Затем вы можете позвонить test как

test("us", "<=", "number", -10)

Тестирование на mtcars

test <- function(op, col, value) {
   mtcars %>% filter(match.fun(op)(!!sym(col), value)) 
}

test("==", "cyl", 6)

#   mpg cyl disp  hp drat   wt qsec vs am gear carb
#1 21.0   6  160 110 3.90 2.62 16.5  0  1    4    4
#2 21.0   6  160 110 3.90 2.88 17.0  0  1    4    4
#3 21.4   6  258 110 3.08 3.21 19.4  1  0    3    1
#4 18.1   6  225 105 2.76 3.46 20.2  1  0    3    1
#5 19.2   6  168 123 3.92 3.44 18.3  1  0    4    4
#6 17.8   6  168 123 3.92 3.44 18.9  1  0    4    4
#7 19.7   6  145 175 3.62 2.77 15.5  0  1    5    6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...