r - curly curly 整洁的评估编程,具有多个输入和跨列的自定义函数
问题描述
我的问题与此问题类似,但我需要跨列应用更复杂的函数,但我不知道如何将 Lionel 建议的解决方案应用于具有范围动词 likefilter_at()
或filter()
+across()
等价物的自定义函数。看起来并没有{{{}}}
引入“superstache”/ 运算符。
这是我想做的一个非编程示例(不使用 NSE):
library(dplyr)
library(magrittr)
foo <- tibble(group = c(1,1,2,2,3,3),
a = c(1,1,0,1,2,2),
b = c(1,1,2,2,0,1))
foo %>%
group_by(group) %>%
filter_at(vars(a,b), any_vars(n_distinct(.) != 1)) %>%
ungroup
#> # A tibble: 4 x 3
#> group a b
#> <dbl> <dbl> <dbl>
#> 1 2 0 2
#> 2 2 1 2
#> 3 3 2 0
#> 4 3 2 1
我还没有找到与+对应的这一filter_at
行,但由于新的(ish)tidyeval 函数早于 dplyr 1.0,我认为可以搁置这个问题。这是我尝试制作一个程序版本,其中过滤变量由用户提供,带有点:filter
across()
my_function <- function(data, ..., by) {
dots <- enquos(..., .named = TRUE)
helperfunc <- function(arg) {
return(any_vars(n_distinct(arg) != length(arg)))
}
dots <- lapply(dots, function(dot) call("helperfunc", dot))
data %>%
group_by({{ by }}) %>%
filter(!!!dots) %>%
ungroup
}
foo %>%
my_function(a, b, group)
#> Error: Problem with `filter()` input `..1`.
#> x Input `..1` is named.
#> i This usually means that you've used `=` instead of `==`.
#> i Did you mean `a == helperfunc(a)`?
如果有一种方法可以在vars()
参数中插入一个 NSE 运算符filter_at
而不必进行所有这些额外的调用,我会很高兴(我假设这是一个{{{}}}
函数会做的事情?)
解决方案
也许我误解了问题所在,但转发点的标准模式似乎在这里工作正常:
my_function <- function(data, ..., by) {
data %>%
group_by({{ by }}) %>%
filter_at(vars(...), any_vars(n_distinct(.) != 1)) %>%
ungroup
}
foo %>%
my_function( a, b, by=group ) # works
推荐阅读
- python - Python requests.post 代码将结果限制为 200。如何调整代码以获得所有 1000+ 的结果?
- html - 为什么我的视频没有显示?
- c++ - 为什么我能够更改作为常量引用传递的对象的成员?
- scala - 如何从 spark DataFrame 中获取所有行?
- algorithm - 如何查找目的地和源之间的距离是否小于5?
- c++ - 一个参数构造函数如何工作?
- ios - 如何运行两个反应本机应用程序?
- vue.js - 如何使用vue资源在标头中发送多个参数
- amazon-web-services - 如何从 cli 本地连接到现有的弹性 beanstalk 实例?
- node.js - Rabbit MQ amqplib 错误“没有可分配的通道”