你可以 "save" dplyr 函数供以后使用吗?

Can you "save" dplyr functions for later use?

这是一个好奇的问题 --- 我实际上永远不需要这样做,但我正在尝试了解 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))

如果我正在编写脚本,我会修复 this 只是定义一个函数来为我执行 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)