2011-09-29 10 views
14

Al agregar un elemento con nombre a una lista, ¿se garantiza que el elemento se agregará al final de la lista? En la práctica, parece ser el caso, pero no estoy seguro si esta es una suposición peligrosa.Agregar un elemento nombrado a la lista con nombre: ¿se garantiza que se agregará al final de la lista?

test = list() 
test[[ "one" ]] = 1 
test[[ "two" ]] = 2 # will always appear after "one"? 
test[[ "three" ]] = 3 # will always appear after "two"? 
+0

Para ser claros, está utilizando una clave de cadena '[['one']]' o '[['1']]' no una tecla numérica '[[1]]'. ¿Y podemos tomar todas sus claves de cadena en un orden de clasificación? ¿Puedes hacer teclas de cadena como '[['1']]' en lugar de '[['una']]'? – smci

Respuesta

20

Si no está documentado (y no parece ser así), entonces no me fiaría de él. Puede asegurarse de que aparece al final de la lista haciendo algo como:

test <- list() 
test <- c(test, one=1) 
test <- c(test, two=2) 
test <- c(test, three=3) 
+2

Pero tenga mucho cuidado de cómo agregar cosas a una lista. mira el resultado de 'Rgames: tl <- list()' 'Rgames: tl [[1]] <- list (one = 1)' 'Rgames: tl [[2]] <- data.frame (two = 2) ' ' Rgames: tl $ three <- 3' –

+0

@CarlWitthoft: el comportamiento puede ser diferente para 'tl [['2']]' vs 'tl [[2]]' ie claves de cadena (como el OP lo hace) frente a las teclas numéricas (como lo hizo) – smci

+1

'append (test, list (three = 3))' es otra opción – baptiste

3

sospecho si profundizado en el código C de R entonces se vería que era verdad, pero como dice Joshua, su no documentado Puede solicitar al R-dev una opinión sobre si se debe documentar dicho comportamiento . Es posible que ya exista un código existente que dependa de él.

+2

Spacedman - buena sugerencia para pedirle a R-dev que lo documente. ¡Gracias! – SFun28

+3

Ummmm .... Me siento en apuros para ver cómo los nuevos elementos de una lista (o un marco de datos, o un vector para el caso), podrían colocarse en cualquier lugar PERO en el "final". En el momento en que define un elemento, se le asigna una ubicación no utilizada. Énfasis en "sin usar". Esto debería ser tan obvio como el hecho de que agregar, por ejemplo, un tercer elemento a una lista con dos elementos NO lo asignará a la ubicación 47. –

+2

Estoy de acuerdo en que poner un elemento en el 7mo lugar de una lista de longitud 12 sería perverso, pero ¿por qué el final, y no el comienzo? Cuando agregas un elemento por nombre, no estás dando ninguna información posicional, por lo tanto, a menos que se indique lo contrario, el idioma es libre de ponerlo en cualquier lugar. Algunos idiomas pueden terminar ordenándolo por el valor hash de la clave de cadena. – Spacedman

Cuestiones relacionadas