2009-07-09 17 views

Odpowiedz

57

Listy R można traktować jako skróty - wektory obiektów, do których można uzyskać dostęp z nazwy. Stosując to podejście można dodać nowy wpis do listy tak:

key <- "width" 
value <- 32 

mylist <- list() 
mylist[[ key ]] <- value 

Tutaj używamy ciąg przechowywane w kluczu zmiennym dostępu do pozycji na liście podobnie jak przy użyciu wartości przechowywanej w zmiennej pętli i dostęp do wektora przez:

vector[ i ] 

wynik jest:

myList 
$width 
[1] 32 
+2

Dziękujemy! Nie rozumiem jeszcze tego operatora indeksowania. Chociaż jest to wyjaśnione tutaj: http://cran.r-project.org/doc/manuals/R-lang.html#Indexing, użycie, które pokazałeś, nie jest opisane. Czy istnieje dokument online, w którym jest on opisany prawidłowo? – Frank

+0

Jeśli wartości są typami podstawowymi (np. Jedna cyfra, znak itp.), Można użyć zwykłej tablicy, takiej jak: x <- c (1, 4, 2, 5). Następnie przypisz nazwy do każdej wartości indeksu, na przykład: names (x) <- c ("a", "b", "c", "d"). Możesz wtedy odnosić się do nich jako x ['a'], x ['b'] itd. – JAponte

13

elementy list w R może być nazwane. Więc w twoim przypadku po prostu zrobić

> mylist = list() 
> mylist$width = value 

Gdy R napotyka ten kod

> l$somename=something 

gdzie l jest lista. Dodaje do listy element coś i nazywa go nazwą somename. Następnie można uzyskać dostęp za pomocą

> l[["somename"]] 

lub

> l$somename 

Nazwę można zmienić nazw poleceń:

> names(l)[names(l)=="somename"] <- "othername" 

lub jeśli teraz pozycja elementu w lista:

> names(l)[1] <- "someothername" 
7

Wbudowana funkcja setNames() ułatwia tworzenie skrótów z podanych list kluczy i wartości. (Dzięki Nick K za lepszą propozycję.)

Zastosowanie: hh <- setNames(as.list(values), keys)

Przykład:

players <- c("bob", "tom", "tim", "tony", "tiny", "hubert", "herbert") 
rankings <- c(0.2027, 0.2187, 0.0378, 0.3334, 0.0161, 0.0555, 0.1357) 
league <- setNames(as.list(rankings), players) 

Następnie dostępu wartości za pomocą przycisków jest łatwe:

league$bob 
[1] 0.2027 
league$hubert 
[1] 0.0555 
+2

'league2 <- setNames (as.list (rankingi), gracze)' jest około 4,5 razy szybsze, a ponieważ używa funkcje wektorowe, byłoby bardziej "R" sposobem na zrobienie tego. (Demo 'microbenchmark :: microbenchmark (league <- as.hash (gracze, rankingi), league2 <- setNames (as.list (rankingi), gracze), czasy = 1000)') –

+0

@NickK: agree, 'setNames' jest o wiele lepszym rozwiązaniem! Zastąpiłem go funkcją zdefiniowaną przez użytkownika. Twoje zdrowie! –

Powiązane problemy