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

输入dplyr::filter()作为函数的参数,r,dplyr,tidyverse,nse,R,Dplyr,Tidyverse,Nse,输入dplyr::过滤器以运行 如何创建一个函数,该函数接受任何dplyr::filter作为输入,并返回满足过滤器要求的行数 我尝试过类似的方法,但不起作用: library(tidyverse) filter_function <- function(dataset, filter_text) { dataset %>% filter_text %>% nrow() -> n_rows_satisfy_filter paste0( "Number

输入dplyr::过滤器以运行

如何创建一个函数,该函数接受任何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)
}
给出错误:

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

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

尝试此代码,
eval
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)

filter_函数尝试此代码,
eval
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)

使用
tidyverse
过滤函数,另一个选项是
parse\u expr
from
rlang

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"
库(dplyr)
过滤函数%
nrow()%>%
paste0(“满足筛选条件的行数:,)
}
filter_函数(iris,“filter(数据集,萼片长度>5,物种=='setosa')”)
#[1] “符合筛选条件的行数:22”

对于
tidyverse
,另一个选项是
parse_expr
from
rlang

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"
库(dplyr)
过滤函数%
nrow()%>%
paste0(“满足筛选条件的行数:,)
}
filter_函数(iris,“filter(数据集,萼片长度>5,物种=='setosa')”)
#[1] “符合筛选条件的行数:22”

是否可以避免将数据集硬编码到字符串中,而仍然使用tidyverse?例如,类似于
dataset%>%eval(parse_expr(filter_text))
,其中filter_text类似于
filter(Sepal.Length>5&Species='setosa')
?@RasmusLarsen它需要数据集的环境,可以避免将数据集硬编码到字符串中,并且仍然使用tidyverse吗?例如,类似于
dataset%>%eval(parse_expr(filter_text))
,其中filter_text类似于
filter(Sepal.Length>5&Species==“setosa”)
?@RasmusLarsen它需要数据集的环境