在 dplyr 过滤条件中混合函数和参数

Mixing functions and parameters in dplyr filter condition

我正在尝试创建一个函数,它将接受一个 data.frame 和一个表示特定年份(例如 2015 年)值的整数。然后该函数将使用 Dplyr 和 return 过滤后的数据集。

以下是一些测试数据、库和非参数化的 dplyr 调用:

library(dplyr)
library(lazyeval)
library(lubridate

vct_dates <- c("2015-04-30", "2015-04-30", "2012-04-30", "2010-04-30")
vct_numbers <- c(21, 45, 103, 214)
df_test <- data.frame(date = vct_dates, value = vct_numbers)

df_test %>% filter(year(date) == 2015)

现在,以下是我尝试将此功能封装到一个函数中:

fn_filter_year <- function(df_data, intYear) {
filter_condition <- interp(quote(year(x) == y), x=as.name("date"), y = intYear)
df_data %>% filter_(filter_condition)
return(df_data)

}

我收到一个错误 "could not find the function 'year' " ??

如有任何建议,我们将不胜感激。

这是因为您正在创建的调用没有捕获您正在创建它的环境。最简单的解决方法是在公式上使用 interp() 而不是调用,因为公式会保留其环境。您可以使用

fn_filter_year <- function(df_data, intYear) {
    filter_condition <- interp(~year(x) == y, x=as.name("date"), y = intYear)
    df_data %>% filter_(filter_condition)
}

fn_filter_year(df_test, 2015)
#         date value
# 1 2015-04-30    21
# 2 2015-04-30    45

像这样使用 filter 而不是 filter_

filter_year <- function(data, intYear) filter(data, year(date) == intYear)

filter_year(df_test, 2015) # test

给予:

        date value
1 2015-04-30    21
2 2015-04-30    45

如果您的想法是将条件分开,那么如果您将 year = year 添加到 interp:

,您的代码将起作用
fn_filter_year <- function(df_data, intYear) {
    condition <- interp(quote(year(x) == y), x = as.name("date"), y = intYear, year = year)
    df_data %>% filter_(condition)
}

fn_filter_year(df_test, 2015) # test

给出与上面相同的输出。