[英]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()類似,但不是重復的,因為當前問題試圖改變整個過濾器,而不僅僅是靜態過濾器的輸入。
試試此代碼, eval
在envir
指定的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_expr
的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"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.