“你能”吗;“保存”;dplyr函数供以后使用?

“你能”吗;“保存”;dplyr函数供以后使用?,r,dplyr,tidyeval,R,Dplyr,Tidyeval,这是一个好奇的问题——我永远不会真正需要这样做,但我正试图理解R的准旋转和整洁的评估特性,我认为这将帮助我做到这一点 假设您想从starwars数据集中过滤机器人: library(dplyr) library(rlang) starwars %>% filter(species == "Droid") 是否可以执行诸如保存过滤器调用之类的操作,并在以后重新使用?如果有许多条件可供筛选,这将有助于简洁性。差不多 filter_droid = some_quote(f

这是一个好奇的问题——我永远不会真正需要这样做,但我正试图理解R的准旋转和整洁的评估特性,我认为这将帮助我做到这一点

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

library(dplyr)
library(rlang)

starwars %>% filter(species == "Droid")
是否可以执行诸如保存
过滤器
调用之类的操作,并在以后重新使用?如果有许多条件可供筛选,这将有助于简洁性。差不多

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
或者使用
以注入多个

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

使用eval和!!在这种情况下?它似乎也在做同样的事情<代码>强制在当前上下文中立即求值。另一方面,
eval()
的参数可以在表达式的所有其他部分之前求值,也可以不求值@drown除了Artem提出的观点外,您不能使用
eval()
mutate()
来创建多个参数。您需要使用
扩展为多个参数。如果列表中有多个表达式,可以使用
拼接它们,例如
starwars%>%变异(!!!新颜色)
new_cols = exprs(col1 = 1, col2 = 2)
starwars %>% mutate(!!!new_cols)