1

输入 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 

该问题与Using dplyr filter() in programming类似但不是重复的,因为当前问题试图改变整个过滤器,而不仅仅是静态过滤器的输入。

4

2 回答 2

3

试试这段代码,在指定的环境中计算参数eval并返回计算值。exprenvir

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' )" )
于 2017-11-29T08:22:54.943 回答
1

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"
于 2017-11-29T08:34:53.307 回答