输入dplyr::filter()作为函数的参数
输入dplyr::过滤器以运行 如何创建一个函数,该函数接受任何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
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
fromrlang
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
fromrlang
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它需要数据集的环境