Мне понравился ответ @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