您可以“保存” dplyr函数供以后使用吗?

问题描述

这是一个好奇心问题-我实际上不需要这样做,但是我试图理解R的准引用和整洁的评估功能,并且我认为这将对此有所帮助。

假设您要从starwars数据集中过滤机器人:

library(dplyr)
library(rlang)

starwars %>% filter(species == "Droid")

是否可以执行类似保存filter调用并在以后重用的操作?如果要过滤的条件很多,这对于简化将很有用。像

filter_droid = some_quote(filter(species == "Droid"))

starwars %>% some_unquote(filter_droid)

当然,您可以这样做:

cond = expr(species == "Droid")

starwars %>% filter(eval(cond))

,但是当有多个参数时,这种想法并不总是可行。例如,当使用mutate创建两个新列时,这将不起作用:

new_cols = exprs(col1 = 1,col2 = 2)

starwars %>% mutate(eval(new_cols))

如果我正在编写脚本,则可以通过定义一个对我执行mutate调用函数解决这个问题-为了好奇,我想忽略那样做。您如何“保存” mutate / filter调用,或者至少保存其中的参数,以便以后在代码中交互使用?

解决方法

您可以使其功能

filt <- . %>% filter(species == "Droid")
starwars %>% filt

或者在注入单个参数时使用eval()运算符,而不是使用!!

cond = expr(species == "Droid")
starwars %>% filter(!!cond)

或使用!!!注入多个。

new_cols = exprs(col1 = 1,col2 = 2)
starwars %>% mutate(!!!new_cols)