如何解决使用整洁的评估过滤我自己的功能
编写自己的函数时,我很难使用整洁的评估。 我将使用ToothGrowth数据集来说明我的问题,在该数据集中我们要过滤例如VC作为补充。
install.packages("tidyverse")
library(tidyverse)
data(ToothGrowth)
test <- function(df,condition) {
df %>% filter(supp %in% condition)
}
test(ToothGrowth,"VC")
这将返回预期的输出,其中数据帧仅包含VC作为supp
。
但是,我不想引用函数中的所有参数,这有点复杂,并且需要更多的参数。这只是为了演示问题。
我遇到的困难是,dplyr::filter()
需要带引号的参数。我的解决方案是使用ensym()
,所以我可以使用VC
代替"VC"
。
test <- function(df,condition) {
condition <- ensym(condition)
df %>% filter(supp %in% condition)
}
test(ToothGrowth,VC)
Fehler: Problem with `filter()` input `..1`.
x 'match' benötigt Vektoren als Argumente
ℹ Input `..1` is `supp %in% condition`.
到目前为止,我已经尝试过quo()
,enquo()
,sym()
,ensym()
,但是无法正常工作。
是否可以为我的函数提供未加引号的参数并在函数内对其进行引用,以便dplyr::filter()
可以使用它?
感谢您的帮助。
解决方法
您可以使用deparse
+ substitute
将未加引号的参数更改为带引号的参数。
library(dplyr)
test <- function(df,condition) {
val <- deparse(substitute(condition))
df %>% filter(supp %in% val)
}
test(ToothGrowth,VC)
,
VC
是一个值,而不是一个变量。如果确实需要,可以使您要寻找的UI,但这会使您的功能感觉很独特。如果要遵循约定,请为数据框列保留数据掩码。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。