过滤大于(或小于)功能参数

时间:2019-05-06 08:35:06

标签: r dplyr

我有这样的dplyr代码

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

我想通过这样的调用来创建函数

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

但是我想为该数字过滤器添加偶数参数。通常,我的操作方式与country_code相同。但是我希望能够呼叫偶数= 0或数字小于1,依此类推。

所以问题是如何处理函数调用中的刨丝器(少/等)符号?

应该像test <- function(country_code = "us", number > 0)

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

3 个答案:

答案 0 :(得分:8)

您可以使用...表示法将其他参数传递给过滤器功能。

示例:

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

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

答案 1 :(得分:0)

我喜欢@JohannesNE的回答。这是使用match.funrlang::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

答案 2 :(得分:0)

使用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