首页 > 解决方案 > 过滤函数不返回过滤后的df

问题描述

我有这样的功能:

sub_set <- function(var) {
    varname <- enquo(var)
    dict <- filter(dictionary, var == !!varname)
    return(dict)
}
dict <- sub_set(Age)

这不起作用,因为它返回:

~Age 中的错误:找不到对象“Age”

如果我将函数称为:

dict <- sub_set("Age")

它可以工作,但是我需要在不带引号的情况下调用它,因为这个函数是也使用 (var) 的更大函数的一部分,并且引用它会破坏函数的其他部分。那么我怎样才能通过传递不带引号的参数来使其工作呢?

问候,

标签: rdplyr

解决方案


用于enexpr转换varname类对象,然后转换为as_string字符串。

library(dplyr)
library(rlang)

sub_set <- function(var) {
    varname <- as_string(enexpr(var))
    dict <- filter(dictionary, var == !!varname)
    return(dict)
}

dictionary <- data.frame(var = c("Age", "x"), var2 = 1:2) # test data
dict <- sub_set(Age)
dict
##   var var2
## 1 Age    1

碱基R

这也可以在基础 R 中轻松完成:

sub_set_base <- function(var) {
   varname <- deparse(substitute(var))
   subset(dictionary, var == varname)
}
sub_set_base(Age)
##   var var2
## 1 Age    1

公式

另一个不涉及传递字符串的基本 R 设计是传递一个公式:

sub_set_fo <- function(fo) {
   subset(dictionary, var == all.vars(fo))
}
sub_set_fo(~Age)
##   var var2
## 1 Age    1

推荐阅读