簡體   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