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