首页 > 解决方案 > 通过R中的过滤器识别函数输入?

问题描述

在我foo()下面的调用中,有没有办法在函数内部识别filter_var =(ie, ) 的输入?test

目前,无法识别输入。

library(tidyverse)
library(rlang)

foo <- function(..., filter_var = NULL){

filter_var <- rlang::ensyms(filter_var)
  
dat <- expand_grid(...)  

dat %>%
filter(
  
    {{filter_var}} != "A"   ## HERE `filter_var` is not recognized. 
  )
}

foo(study = 1:2, test = LETTERS[1:2], filter_var = test)

#  study test 
#  <int> <chr>
#1     1 A    
#2     1 B    
#3     2 A    
#4     2 B 

标签: rfunctiondplyrtidyverserlang

解决方案


你不能结合ensym{{}}{{}}不带显式使用ensym

foo <- function(..., filter_var = NULL){
  dat <- expand_grid(...)  
  dat %>%
    filter({{filter_var}} != "A")
}

foo(study = 1:2, test = LETTERS[1:2], filter_var = test)

或使用!!ensym请注意,您只解码一个符号,所以使用ensym而不是ensyms)。

foo <- function(..., filter_var = NULL){
  filter_var <- rlang::ensym(filter_var)
  dat <- expand_grid(...)  
  dat %>%
    filter(!!filter_var != "A")
}

推荐阅读