es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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 
> 
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para distinguir el argumento (cyl) de su valor (hp) en str_glue(), puedes usar llaves dobles ({{ }}) alrededor de cyl, que es una función de la evaluación ordenada (tidy evaluation). Esto permitirá que cyl sea interpretado como el argumento pasado a la función, al mismo tiempo que permite que su valor ("hp") sea usado en la instrucción str_glue().

    Entonces, el código revisado para sfun() usando {{ }} sería el siguiente:

    sfun <- function(mydf, cyl){
      myoutput <- 
        mydf %>%
        mutate(attempt1 = sprintf("%s muestra valores de hp", !!sym(cyl))) %>%
        mutate(attempt2 = str_glue("{{cyl}} no muestra valores de hp"))
      return(myoutput)
    }
    
    mtcars %>% dplyr::select(cyl, hp) %>% head(5) %>% sfun(cyl="hp")
    

    Esto resultaría en la siguiente salida:

                      cyl  hp            attempt1                   attempt2
    Mazda RX4           6 110 6 muestra valores de hp hp no muestra valores de hp
    Mazda RX4 Wag       6 110 6 muestra valores de hp hp no muestra valores de hp
    Datsun 710          4  93 4 muestra valores de hp hp no muestra valores de hp
    Hornet 4 Drive      6 110 6 muestra valores de hp hp no muestra valores de hp
    Hornet Sportabout   8 175 8 muestra valores de hp hp no muestra valores de hp
    

    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ón str_glue().

Comments are closed.