Esta puede ser una pregunta trivial, pero estoy luchando por abordarla. Estoy tratando de indexar una variable nombrada en una función. Tome el siguiente ejemplo. Me gustaría asignar etiquetas a mis variables. Sé que puedo hacer esto con las siguientes líneas de código

iris<–iris
attr(iris$Sepal.Width, "label") <- "Label 1"
library(Hmisc)
contents(iris)
              Labels Levels Storage
Sepal.Length                 double
Sepal.Width  Label 1         double # my variable is labelled
Petal.Length                 double
Petal.Width                  double
Species                   3 integer

Sin embargo, si intento crear una función que realice la misma operación, incurro en un error porque no puedo indexar variables con nombre en funciones escritas por el usuario. Por ejemplo, si creo una función labvar así definida, incurro en un error.

labvar <- function(var,lab){
attr(iris[[var]], "label") <- lab
}
labvar("Sepal.Length", "label 2")
             Labels Levels Storage
Sepal.Length                 double # variable remains not labelled
Sepal.Width  Label 1         double
Petal.Length                 double
Petal.Width                  double
Species                   3 integer
 

También he vinculado varias alternativas para indexar la variable con iris[[var]], iris[var], iris{{var}} pero ninguno de estos enfoques funciona. ¿Alguien puede ayudarme y explicarme cómo puedo indexar una variable nombrada como lo haría con $ fuera de la función?

De antemano muchas gracias por tu ayuda

0
Alex 22 ene. 2021 a las 20:13

1 respuesta

La mejor respuesta

Hay muchos problemas de sintaxis / función aquí.

  • [[ funciona con vectores de caracteres, por lo que una función con cuerpo attr(iris[[var]], "label") esperaría var = "Speal.Length" como argumento, no var = Sepal.Length
  • Su uso de -> dentro de la función es incorrecto: desea asignar la etiqueta al atributo, no el atributo a la etiqueta
  • Y su función probablemente debería tomar todo el marco de datos como entrada,
  • y devolver el marco de datos modificado, tal cual,
  • y de manera similar necesitas asignar el resultado

Abordar cada uno de estos:

lab_var = function(data, var, lab) {
  attr(data[[var]], "label") = lab
  return(data)
}

labeled_iris = lab_var(iris, "Sepal.Length", "my_label")
attr(labeled_iris$Sepal.Length, "label")
# [1] "my_label"
2
Gregor Thomas 22 ene. 2021 a las 17:49