2011-10-30 13 views
39

Zauważyłem, że to zachowanie jest dziwne i chciał, aby bardziej doświadczeni użytkownicy podzielili się swoimi przemyśleniami i obejściami. On pracuje poniżej przykładowy kod w R:Przypisywanie wartości NULL elementowi listy w R?

sampleList <- list() 
d<- data.frame(x1=letters[1:10],x2=1:10,stringsAsFactors=FALSE) 
for(i in 1:nrow(d)) 
     sampleList[[i]] <- d$x1[i] 

print(sampleList[[1]]) 
print(sampleList[[2]]) 
print(sampleList[[3]]) 
print(length(sampleList)) 
sampleList[[2]] <- NULL 
print(length(sampleList)) 
print(sampleList[[2]]) 
print(sampleList[[3]]) 

Lista elementy się przesunąć w górę. Może to jest zgodne z oczekiwaniami, ale staram się zaimplementować funkcję, w której łączę dwa elementy listy i upuszczam jeden. Zasadniczo chcę stracić ten indeks listy lub mieć go jako NULL.

Czy jest jakiś sposób mogę przypisać NULL do niego i nie widać powyższego zachowania?

Dziękujemy za sugestie.

+0

Czy 'unlist' pomóc sprawę? –

+1

Używasz niewłaściwego R - spróbuj wprowadzić więcej wektoryzacji, w przeciwnym razie twoje kody pozostaną powolne, brzydkie i sprzeczne z intuicją. – mbq

Odpowiedz

49

Dobre pytanie.

zobacz się z R-FAQ:

W R, jeśli x jest lista, to x [i] < - NULL x [[i]] < - NULL usunięcie określonych elementów od x. Pierwszy z nich jest niezgodny z literą S, gdzie jest to operacja "no-op". (Zauważ, że można ustawić elementy na NULL za pomocą X [i] < - lista (null).)

rozważmy następujący przykład:

> t <- list(1,2,3,4) 
> t[[3]] <- NULL   # removing 3'd element (with following shifting) 
> t[2] <- list(NULL)  # setting 2'd element to NULL. 
> t 
[[1]] 
[2] 1 

[[2]] 
NULL 

[[3]] 
[3] 4 

UPDATE:

Jak autor the R Inferno skomentował, że w przypadku NULL może występować więcej subtelnych sytuacji. Rozważmy dość ogólną strukturę kodu:

# x is some list(), now we want to process it. 
> for (i in 1:n) x[[i]] <- some_function(...) 

teraz mieć świadomość, że jeśli some_function() powraca NULL, być może nie będzie to, co chcesz: niektóre elementy będą tylko znikają. powinieneś raczej użyć funkcji lapply. Spójrz na ten przykład zabawki:

> initial <- list(1,2,3,4) 
> processed_by_for <- list(0,0,0,0) 
> processed_by_lapply <- list(0,0,0,0) 
> toy_function <- function(x) {if (x%%2==0) return(x) else return(NULL)} 
> for (i in 1:4) processed_by_for[[i]] <- toy_function(initial[[i]]) 
> processed_by_lapply <- lapply(initial, toy_function) 
> processed_by_for 
    [[1]] 
    [1] 0 

    [[2]] 
    [1] 2 

    [[3]] 
    NULL 

    [[4]] 
    [1] 4 

> processed_by_lapply 
    [[1]] 
    NULL 

    [[2]] 
    [1] 2 

    [[3]] 
    NULL 

    [[4]] 
    [1] 4 
+14

To jest Circle 8.1.55 z "The R Inferno" http://www.burns-stat.com/pages/Tutor/R_inferno.pdf Circle 8.1.56 jest bardziej subtelną wersją tego. –

+0

@Patric, zaktualizowałem odpowiedź zgodnie z Twoim komentarzem. – Max

+0

Dziękuję za szczegółowe wyjaśnienie. Jak czytać podręczniki i nie przeoczyć tych subtelności !!!! – harshsinghal

5

Twoje pytanie jest nieco mylące.

Przypisanie wartości null istniejącemu obiektowi powoduje usunięcie tego obiektu (może to być bardzo przydatne, na przykład jeśli masz ramkę danych i chcesz usunąć określone kolumny). Właśnie to zrobiłeś. Nie jestem w stanie określić, czego chcesz. Można spróbować

sampleList[[2]] <- NA 

zamiast NULL, ale jeśli przez „Chcę stracić” masz na myśli usuń, a potem już się udało. Dlatego "elementy listy są przesunięte w górę".

0
obj = list(x = "Some Value") 
obj = c(obj,list(y=NULL)) #ADDING NEW VALUE 
obj['x'] = list(NULL) #SETTING EXISTING VALUE 
obj 
+1

Jak to się różni od zaakceptowanej odpowiedzi? –

Powiązane problemy