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