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.

Pasando el nombre de la columna como argumento en una función dentro de tuberías.

Estoy intentando escribir una función pasando un nombre de variable como argumento. Luego se utiliza en un flujo aguas abajo para mutar una variable.

Utilizando un enfoque más clásico, pero quizás un poco torpe, puedo hacer esto:

var = "Sepal.Width"

scale_fun1 = function(dat,var) {

  dat[,"new_var"] = dat[,var]*100

  return(dat)

}

scale_fun1(iris,var)

Pensé que esto sería sencillo utilizando un pipe, pero resultó ser más difícil de lo que pensé, ya que cuando la función pasa la var por el pipe, no se analiza como debería, lo que da como resultado un error de operador binario de argumento no numérico. ¿Cómo puedo solucionarlo por favor?

var = "Sepal.Width"

scale_fun2 = function(dat,var) {

  iris %>% dplyr::mutate(new_variable = var * 100)

}

scale_fun2(iris,var)
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con scale_fun2 es que var se está pasando como una cadena de caracteres, pero debe evaluarse como un nombre de variable en la función mutate. Un enfoque es usar !!sym() para convertir la cadena en un símbolo y luego evaluarlo dentro de la función mutate:

    var = "Sepal.Width"
    
    scale_fun2 = function(dat, var) {
      dat %>%
        mutate(nueva_variable = !!sym(var) * 100)
    }
    
    scale_fun2(iris, var)
    

    Esto utiliza el operador !! (doble admiración) para indicar a dplyr que evalúe el símbolo que crea sym().

Comments are closed.