如何在数据框的自定义过滤器函数中包含变量?

问题描述 投票:0回答:3

我似乎无法让我的 R 函数工作,该函数旨在根据过滤器值(字符)和过滤器字段输入参数过滤(dplyr)数据帧。这是我的设置代码:

df <- data.frame(a=c(1,2,3,4),temp=c("a","b","c","d"))
 
filt_func <- function(input_df,filter_value,filter_field){
  filt_df <- input_df %>% dplyr::filter(grepl(filter_value,filter_field))
}

现在,当我在不使用函数的情况下运行它时,它可以工作吗?!工作代码:

> df %>% dplyr::filter(grepl("d", temp))
  a temp
1 4    d

但是,我的功能没有!

> output <- filt_func(df,"d",temp)
Error in `dplyr::filter()`:
i In argument: `grepl(filter_value, filter_field)`.
Caused by error in `is.factor()`:
! object 'temp' not found
Run `rlang::last_trace()` to see where the error occurred.  

在“temp”周围加上引号可以使代码运行,但输出为空。

output <- filt_func(df,"d","temp")

我确信这很愚蠢,但我已经开始这样做太久了,而且自从我编写函数以来已经有一段时间了。我尝试将

return(filt_df)
添加到该函数中,但这没有帮助。

r function dplyr filter
3个回答
2
投票

您必须

get
字符串变量:

filt_func <- function(input_df,filter_value,filter_field){
  filt_df <- input_df %>% dplyr::filter(grepl(filter_value,get(filter_field)))
  filt_df
}

filt_func(df,"d","temp")

或者用

{{}}
:

括起来
filt_func <- function(input_df,filter_value,filter_field){
  filt_df <- input_df %>% dplyr::filter(grepl(filter_value,{{filter_field}}))
  filt_df
}

filt_func(df,"d",temp)

两者都给出:

  a temp
1 4    d

0
投票

我能够通过调用数据框列而不是调用列表来获得相同的输出

output <- filt_func(df,"d",df$temp)

0
投票

使用 dplyr

 进行编程的推荐方法包括 
!!sym(.)
{{.}}
(如 benson23 已演示)。

filt_func1 <- function(input_df, filter_value, filter_field) {
  input_df %>%
    dplyr::filter(grepl(filter_value, !!sym(filter_field)))
}
filt_func1(df, "d", "temp")
#   a temp
# 1 4    d
filt_func2 <- function(input_df, filter_value, filter_field) {
  input_df %>%
    dplyr::filter(grepl(filter_value, {{ filter_field }}))
}
filt_func1(df, "d", "temp")
#   a temp
# 1 4    d

如果你想去NSE(非标准评估),可以这样做:

filt_func3 <- function(input_df, filter_value, filter_field) {
  filter_field <- enquo(filter_field)
  input_df %>%
    dplyr::filter(grepl(filter_value, !!filter_field))
}
filt_func3(df, "d", temp)  # <-- notice that `temp` has no quotes, just the variable name
#   a temp
# 1 4    d
© www.soinside.com 2019 - 2024. All rights reserved.