2015-09-24 10 views
11

Zauważyłem tę nieoczekiwaną cechę:Listy R - w jaki sposób obsługiwane są nazwy elementów?

foo <- list(whatever=1:10) 

Teraz następujące prace, a także:

foo$wha 
foo$w 
foo$whateve 

Jednak po nie:

foo[["wha"]] 

To ma nieoczekiwane konsekwencje (nieoczekiwane dla mnie), że jeśli masz dwie potencjalne nazwy, na przykład "CXCL1" i "CXCL11", a chcesz k teraz, czy CXCL1 nie ma wartości null sprawdzając !is.null(foo$CXCL1), zwróci TRUE, nawet jeśli CXCL1 ma wartość null, ale CXCL11 nie jest.

Moje pytania są następujące:

  1. Jak to działa?
  2. Jaka jest różnica między foo$whatever i foo[["whatever"]]?
  3. Dlaczego ktoś chciałby tego zachowania i jak mogę go wyłączyć?
+6

[Oto moja odpowiedź na podobne pytanie] (http://stackoverflow.com/questions/11066464/you-can-abbreviate-list-names-why/11066583#11066583) –

+6

'help (" [[") 'ma tu wielką wartość (omawia" częściowe dopasowanie ", którego doświadczasz). Powinieneś rozważyć 'foo [[thing", exact = TRUE]] 'jeśli potrzebujesz precyzji w dopasowywaniu (to jest domyślne dla' [[choć)). Możesz także ustawić 'opcje (warnPartialMatchDollar = TRUE)', aby uzyskać ostrzeżenia. – hrbrmstr

+1

Możesz uniknąć problemu w swoim przypadku, wypełniając listę wszystkimi potencjalnymi nazwami i ustawiając je np. 'CXCL1 = NULL' –

Odpowiedz

1
  1. częściowe dopasowanie działa tylko z unikalnymi początkowych podciągów nazw list. Tak więc, na przykład:

    > l <- list(score=1, scotch=2) 
    > l$core #only INITIAL subsequences 
    NULL 
    > l$sco #only UNIQUE subsequences 
    NULL 
    > l$scor 
    [1] 1 
    
  2. Zarówno [[ i $ wybrać pojedynczy element listy. Główne różnice polegają na tym, że $ nie pozwala na obliczanie indeksów, podczas gdy [[ ma, a częściowe dopasowywanie jest domyślnie dozwolone z operatorem $, ale nie z [[.

  3. Te ekstrakt lub wymiana operatorzy się z S, chociaż R ogranicza zastosowanie częściowego dopasowania, a S wykorzystuje częściowe dopasowanie w większości podmiotów domyślnie.

W przykładzie, jeśli CXCL1 i CXCL11 współistnieją i wskaźnik foo$CXCL1, że nie częściowy mecz i powinien wrócić CXCL1 „s wartość. Jeśli nie, może jest inny problem.

Należy zwrócić uwagę, [[ nie dopuszcza częściowego dopasowywania jako domyślnego, począwszy od wersji R 2.7.0.

Powiązane problemy