2015-09-09 13 views
6

W poniższym kodzie oczekiwałem czegoś o długości 96, ale otrzymałem listę o długości 48. Czy możesz wyjaśnić ten wynik?Wypełnianie listy pustymi wektorami powoduje zmianę jej długości

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 

Teraz odpowiem na pytanie, które doprowadziło mnie do tego zachowania. Pierwotne pytanie brzmiało: "Jak utworzyć listę pustych wektorów w R?" a odpowiedź brzmiała: "Wymień c() z character() w powyższym kodzie."

Odpowiedz

8

Elementy listy ustawień równe c() (alias NULL) usuwa je, a zatem ta pętla powoduje usunięcie wszystkich innych elementów na liście. Aby to zobaczyć, rozważmy mniejszą przykład, iteracyjnie drukowanie Otrzymany wektor:

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 

Zauważ, że jeśli faktycznie chciał stworzyć listę 96 wartości NULL, można spróbować:

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

inny sposób to: 'rep (list (NULL), 96)' –

+0

Asa notesem, jeśli robisz to w odwrotnej kolejności 'for (i in num_empty: 1) {empty_vecs [[i]] = c()}' lista będzie puste. – agstudy

+2

Mogę uczynić jaśniejszym, że 'c()' jest funkcją, która zwraca 'NULL', gdy nie przekazał żadnych parametrów na wyjściu. 'c()' nie jest funkcją "wektorową", o której wszyscy myślą. Jest przeznaczony do łączenia wektorów. 'c()' nie tworzy pustego wektora w taki sam sposób jak 'character()' lub 'numeric()'. – MrFlick