¿Puede "guardar" las funciones de dplyr para su uso posterior?

Aug 21 2020

Esta es una pregunta de curiosidad --- nunca necesitaré hacer esto, pero estoy tratando de entender las características de evaluación ordenada y cuasicuotaciones de R y creo que esto me ayudará con eso.

Suponga que desea filtrar los droides del starwarsconjunto de datos:

library(dplyr)
library(rlang)

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

¿Es posible hacer algo como guardar la filterllamada y reutilizarla más tarde? Esto sería útil para la concisión si hubiera muchas condiciones por las que filtrar. Algo como

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

starwars %>% some_unquote(filter_droid)

Por supuesto, puedes hacerlo de esta manera:

cond = expr(species == "Droid")

starwars %>% filter(eval(cond))

pero esta idea no siempre funciona cuando hay varios argumentos. Por ejemplo, al hacer dos columnas nuevas con mutate, esto no funciona:

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

starwars %>% mutate(eval(new_cols))

Si estuviera escribiendo un script, arreglaría esto simplemente definiendo una función que haga la mutatellamada por mí --- por curiosidad, quiero ignorar hacer eso. ¿Cómo puede "guardar" la llamada mutate/ filter, o al menos los argumentos dentro de ellos, para usarlos más adelante en su código de forma interactiva?

Respuestas

4 MrFlick Aug 21 2020 at 12:38

Podrías convertirlo en una función

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

O en lugar de usar eval(), use el !!operador al inyectar un solo parámetro

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

o utilizar !!!para inyectar múltiples.

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