r - 将带引号的列表转换为 dplyr::filter 的带引号的表达式列表
问题描述
我正在编写一个函数,该函数dplyr::filter
在执行其他操作之前结合了一个步骤(我想对其进行参数化)。我想为可以覆盖的过滤条件提供一个默认参数。这排除了通过...
一次尝试传递过滤参数,如下所示:
library(rlang)
library(dplyr)
filter_and_stuff1 = function(tbl, filter_args = list(mpg > 33, gear == 4), arg3, arg4){
as_expr = enexpr(filter_args)
sub_tbl = filter(tbl, !!!as_expr)
# do some other things with sub_tbl, arg3 and arg4
sub_tbl
}
但
filter_and_stuff1(mtcars)
Error: Argument 2 filter condition does not evaluate to a logical vector
逗号分隔似乎产生了问题。查看 dplyr 的代码,它是通过调用内部函数来处理的,该函数 quo_reduce
似乎将逗号分隔的值与&
. 我不明白如何在不使用的情况下做到这一点...
TLDR:如何以编程方式将一组参数传递给包含默认表达式的 dplyr::filter?
解决方案
问题在于,通过您使用它的方式,enexpr
还捕获了对 的调用list
,而使用省略号已经将每个表达式分隔为列表的不同元素:
library(rlang)
foo <- function(x) {
enexpr(x)
}
foo(list(a, b, c))
# list(a, b, c)
bar <- function(...) {
enexprs(...)
}
bar(a, b, c)
# [[1]]
# a
#
# [[2]]
# b
#
# [[3]]
# c
为了做你想做的事,你可以使用call_args
从给定的内容中提取每个表达式list
:
baz <- function(x) {
as_expr <- enexpr(x)
# expr just to show
expr(filter(!!!call_args(as_expr)))
}
baz(list(a == 1, b < 2))
# filter(a == 1, b < 2)
推荐阅读
- java - Android中的模块之间如何传输数据?
- python - 耦合二阶 ode 的求解 bvp 值错误
- django - 在 Django 中更新表中的所有值
- visual-studio - TFS:在单个分支设置中将项目移动到多个“分支”
- tensorflow - 回归网络的全整数量化后非常高的误差
- vba - 按日期排序多列列表框 (dd/mm/yyyy)
- .net-core - 如何让我的 .net core razor 项目引用更新的 dll 文件?
- javascript - 如何从 base64 javascript 创建视频元素?
- python - 在pandas读取csv函数中推断日期时间格式时如何保持数据帧索引的时区?
- reactjs - React Accordion 中的复选框在 IE Spring Boot 应用程序中不起作用