2015-09-09 7 views
6

Nel codice seguente, mi aspettavo qualcosa di lunghezza 96, ma ottengo un elenco di lunghezza 48. Puoi spiegare questo risultato?La lista di riempimento con vettori vuoti ne modifica la lunghezza

num_empty = 96 
empty_vecs = as.list(1:num_empty) 
for(i in 1:num_empty){empty_vecs[[i]] = c()} 
length(empty_vecs) 

[1] 48 

Ora risponderò alla domanda che mi ha portato ad incontrare questo comportamento. La domanda iniziale era: "Come faccio a creare un elenco di vettori vuoti in R?" e la risposta è stata "Sostituire c() con character() nel codice sopra."

risposta

8

L'impostazione degli elementi di elenco pari a c() (alias NULL) li rimuove e questo ciclo ha quindi l'effetto di eliminare ogni altro elemento nell'elenco. Per vedere questo, si consideri l'esempio più piccolo, in modo iterativo stampando il vettore risultante:

e <- list(1, 2, 3, 4) 
e 
# [[1]] 
# [1] 1 
# 
# [[2]] 
# [1] 2 
# 
# [[3]] 
# [1] 3 
# 
# [[4]] 
# [1] 4 
# 
e[[1]] <- c() 
e 
# [[1]] 
# [1] 2 
# 
# [[2]] 
# [1] 3 
# 
# [[3]] 
# [1] 4 
# 
e[[2]] <- c() 
e 
# [[1]] 
# [1] 2 
# 
# [[2]] 
# [1] 4 

e[[3]] <- c() 
e 
# [[1]] 
# [1] 2 
# 
# [[2]] 
# [1] 4 

e[[4]] <- c() 
e 
# [[1]] 
# [1] 2 
# 
# [[2]] 
# [1] 4 

Si noti che se effettivamente desidera creare una lista di 96 valori NULL, si potrebbe provare:

replicate(96, c(), FALSE) 
+1

Un altro modo è: 'rep (list (NULL), 96)' –

+0

Asa side note, se lo fai nell'ordine inverso 'for (i in num_empty: 1) {empty_vecs [[i]] = c()}' l'elenco sarà vuoto – agstudy

+2

Potrei rendere più chiaro che 'c()' è una funzione che restituisce 'NULL' quando non viene passato alcun parametro nell'output. 'c()' non è la funzione di "vettore" che tutti sembrano pensare che sia. È per concatenare i vettori. 'c()' non crea un vettore vuoto allo stesso modo 'character()' o 'numereric()' fa. – MrFlick

Problemi correlati