我似乎无法让我的 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)
添加到该函数中,但这没有帮助。
您必须
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
我能够通过调用数据框列而不是调用列表来获得相同的输出
output <- filt_func(df,"d",df$temp)
使用 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