¿Cómo hacer que `str_glue()` discrimine entre un argumento y su valor?
Antecedentes: sfun
es una función que muta mtcars
. sfun
tiene un argumento cyl
que comparte el mismo nombre que el vector cyl
en mtcars
.
Pregunta: Cuando se hace sfun(cyl = "hp")
, ¿cómo puedo hacer que str_glue()
distinga el argumento (cyl
) de su valor (hp
)?
sfun <- function(mydf, cyl){
myoutput <-
mydf %>%
mutate(attempt1 = sprintf("%s muestra valores de hp", !!sym(cyl))) %>% ## esto funciona
mutate(attempt2 = str_glue("{cyl} no muestra valores de hp"))
return(myoutput)
}
mtcars %>% dplyr::select(cyl, hp) %>% head(5) %>% sfun(cyl="hp")
> mtcars %>% dplyr::select(cyl, hp) %>% head(5) %>% sfun(cyl="hp")
cyl hp attempt1 attempt2
Mazda RX4 6 110 6 muestra valores de hp 6 no muestra valores de hp
Mazda RX4 Wag 6 110 6 muestra valores de hp 6 no muestra valores de hp
Datsun 710 4 93 4 muestra valores de hp 4 no muestra valores de hp
Hornet 4 Drive 6 110 6 muestra valores de hp 6 no muestra valores de hp
Hornet Sportabout 8 175 8 muestra valores de hp 8 no muestra valores de hp
>
davy.ai
Para distinguir el argumento (
cyl
) de su valor (hp
) enstr_glue()
, puedes usar llaves dobles ({{ }}
) alrededor decyl
, que es una función de la evaluación ordenada (tidy evaluation). Esto permitirá quecyl
sea interpretado como el argumento pasado a la función, al mismo tiempo que permite que su valor ("hp"
) sea usado en la instrucciónstr_glue()
.Entonces, el código revisado para
sfun()
usando{{ }}
sería el siguiente:Esto resultaría en la siguiente salida:
Como puedes ver, ahora
cyl
se interpreta como el argumento pasado a la función, mientras que"hp"
es el valor usado en la instrucciónstr_glue()
.