2015-07-31 10 views
6

Używam biblioteki hash i chciałbym użyć wektora jako klucza, jednak chce on przypisać do każdej wartości w wektorze, ale chcę użyć samego wektora jako klucz. Jak mogę ustawić i uzyskać dostęp do elementów mieszania, aby to osiągnąć? Chciałbym zrobić coś takiego:Lista R jako klucz do hasza

library(hash) 
h <- hash() 

inc <- function(key) { 
    if(has.key(c(key), h)) { 
    h[[key]] = h[[key]] + 1 
    } else { 
    h[[key]] = 1 
    } 
} 

inc(c('a', 'b')) 

i mają kluczową c('a', 'b') i wartość 1 w hash. Za każdym razem, gdy przechodzę przez ten sam wektor, wartość zwiększa się o jeden.

Rozumiem, że jest to normalne zachowanie w R, ponieważ jest to język programowania tablicowego, ale chciałbym go w tym przypadku uniknąć.

Odpowiedz

2

Oto pomysł: można użyć deparse(), aby utworzyć jednoznaczną ciąg znaków reprezentujący argument wejściowy, który będzie prawidłowym hashem. Teoretycznie może to działać na dowolnym obiekcie R, a nie tylko na wektorach atomowych.

library(hash); 
h <- hash(); 

hinc <- function(key.obj) { key.str <- deparse(key.obj); h[[key.str]] <- if (has.key(key.str,h)) h[[key.str]]+1 else 1; }; 
hget <- function(key.obj) { key.str <- deparse(key.obj); h[[key.str]]; }; 

x1 <- c('a','b'); 
x2 <- 'ab'; 
hinc(x1); 
hinc(x1); 
hinc(x2); 

hget(x1); 
## [1] 2 
hget(x2); 
## [1] 1 
+0

to działa dobrze dla mnie, dzięki! – brancz

0

I stworzyli R package called dict który pozwala używać wektorów jako klucze:

library(dict) 
d <- dict() 
d[[ c("a", "b") ]] <- 1 
d[[ c("a", "b") ]] 

ten powinien być bardziej wydajny niż deparsing obiektów jak sugerowano wcześniej.

+0

Dzięki, wygląda bardzo przydatne! To jedna z funkcji, którą bardzo lubię w Pythonie. – thc