繁体   English   中英

输入dplyr :: filter()作为函数的参数

[英]Input dplyr::filter() as argument to function

输入dplyr :: filter起作用

如何创建将任何dplyr :: filter作为输入并返回满足过滤条件的行数的函数?

我已经尝试过类似的方法,但无法正常工作:

library(tidyverse)

filter_function <- function(dataset, filter_text) {
    dataset %>% filter_text %>% nrow() -> n_rows_satisfy_filter

    paste0( "Number of rows satisfying the filter: ", n_rows_satisfy_filter)
}

在这里,我尝试输入过滤器作为字符串:

filter_function(iris, "filter( Sepal.Length > 5 & Species == 'setosa' )" )

给出错误:

Error in quote(., filter_text) : 
  2 arguments passed to 'quote' which requires 1 

这个问题与在编程使用dplyr filter()类似,但不是重复的,因为当前问题试图改变整个过滤器,而不仅仅是静态过滤器的输入。

试试此代码, evalenvir指定的envir评估expr参数并返回计算值。

library(tidyverse)

filter_function <- function(dataset, filter_text) {
  n_rows_satisfy_filter <- eval(parse(text = filter_text), envir = dataset) %>% nrow()
  paste0( "Number of rows satisfying the filter: ", n_rows_satisfy_filter)
}

filter_function(iris, "filter(dataset, Sepal.Length > 5 & Species == 'setosa' )" )

使用tidyverse ,另一个选项是parse_exprrlang

library(dplyr)
filter_function <- function(dataset, filter_text) {
  eval(rlang::parse_expr(filter_text)) %>% 
         nrow() %>%
         paste0( "Number of rows satisfying the filter: ", .)
}

filter_function(iris, "filter(dataset, Sepal.Length > 5 & Species == 'setosa' )" )
#[1] "Number of rows satisfying the filter: 22"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM