Pregunta

¿Es posible crear nuevos nombres de variables sobre la marcha?

Me gustaría leer tramas de datos a partir de una lista en nuevas variables con números al final. Algo así como orca1, orca2, orca3 ...

Si intento algo así como

paste("orca",i,sep="")=list_name[[i]]

Me sale este error

target of assignment expands to non-language object

¿Hay alguna otra forma de evitar esto?

¿Fue útil?

Solución

Uso assign:

assign(paste("orca", i, sep = ""), list_name[[i]])

Otros consejos

Me parece que podría ser mejor con una lista en lugar de utilizar orca1, orca2, etc, ... entonces sería orca[1], orca[2], ...

Por lo general, usted está haciendo una lista de las variables que se diferencian por nada más que un número, porque ese número sería una manera conveniente de acceder a ellos más tarde.

orca <- list()
orca[1] <- "Hi"
orca[2] <- 59

De lo contrario, assign es justo lo que quieres.

No haga que las tramas de datos. Mantenga la lista, el nombre de sus elementos, pero no conecte a él.

La principal razón para esto es que si haces las variables sobre la marcha, casi siempre va a tener más adelante para iterar a través de cada uno de ellos para llevar a cabo algo útil. Allí nuevamente se verá obligado a iterar a través de cada uno de los nombres que se han creado sobre la marcha.

Es mucho más fácil para nombrar los elementos de la lista y repetir por los nombres.

En lo que se refiere adjuntar, su práctica de programación muy mal en I y puede conducir a una gran cantidad de problemas si no se tiene cuidado.

FAQ dice:

Si usted tiene

varname <- c("a", "b", "d")

que puede hacer

get(varname[1]) + 2

para

a + 2

o

assign(varname[1], 2 + 2)

para

a <- 2 + 2

Así que parece que se utiliza GET cuando se desea evaluar una fórmula que utiliza una variable (como una concatenación), y asignar cuando se quiere asignar un valor a una variable previamente declarado.

Sintaxis para asignar: Asignar (x, valor)

x: un nombre de variable, dado como una cadena de caracteres. No se realiza la coacción, y el primer elemento de un vector de caracteres de longitud mayor que uno se utilizará, con una advertencia.

valor:. valor que se asigna a x

Otra solución complicado es nombrar elementos de lista y attach que:

list_name = list(
    head(iris),
    head(swiss),
    head(airquality)
    )

names(list_name) <- paste("orca", seq_along(list_name), sep="")
attach(list_name)

orca1
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1         3.5          1.4         0.2  setosa
# 2          4.9         3.0          1.4         0.2  setosa
# 3          4.7         3.2          1.3         0.2  setosa
# 4          4.6         3.1          1.5         0.2  setosa
# 5          5.0         3.6          1.4         0.2  setosa
# 6          5.4         3.9          1.7         0.4  setosa

Y esta opción?

list_name<-list()
for(i in 1:100){
    paste("orca",i,sep="")->list_name[[i]]
}

Funciona perfectamente. En el ejemplo que pones, primera línea de falta, y luego le da el mensaje de error.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top