编写一个可以忽略R

时间:2019-06-26 20:40:21

标签: r function dplyr

我想用多个输入编写一个函数。
每个输入都会调整dplyr管道中的特定过滤器参数。

我正在努力开启/关闭grep参数,
也就是说,我希望能够完全忽略grep行

我的数据框(df),具有三个变量(发送,重复,案例)

这是我的功能:

my_filter <- function(df, a, b, c){ 

df <<- df %>%
          filter(sent != a,
                repeat != b,
                 !grepl("_v", cases)) 
}

我希望“ c”参数允许我忽略管道中的最后一行!grepl(“ _ v”,cases)
如何设置“ c”以控制该行的存在/不存在?

2 个答案:

答案 0 :(得分:2)

我建议这样的事情:

my_filter = function(df, a, b, c = TRUE) {
    result = df %>% filter(
      sent != a,
      repeat_col != b
    )
    if(c) result = result %>% filter(!grepl("_v", cases, fixed = TRUE))
    return(result)
}

这将按照您的要求处理条件。如果将c设置为FALSE,则将不应用最后一个条件。 (在其他情况下,您也可以测试if(missing(c))来检查c参数是否由用户提供。)

我也不使用全局赋值,因为您基本上不应该使用全局赋值,return输入结果可以让用户选择结果名称,而不是为他们选择结果名称并可能覆盖他们已经使用的内容

fixed = TRUE只是为了提高效率,因为您的模式是完全匹配的,而不是正则表达式。

答案 1 :(得分:0)

这是另一个选择:

library(dplyr)
my_filter <- function(df, a = FALSE, b = FALSE, c = TRUE){ 
  df %>%
    filter(Sepal.Width != a,
           Sepal.Length != b,
           c | !grepl("v", Species)) 
}

dim(iris %>% my_filter)
#> [1] 150   5

dim(iris %>% my_filter(c=FALSE))
#> [1] 50  5