2014-12-03 15 views
7

Czy istnieje sposób, aby foreach() zwrócił nazwaną listę/data.frame. Na przykład.foreach: Zachowaj nazwy

foo <- list(a = 1, b = 2) 
bar <- foreach (x = foo) %do% { x * 2 } 

zwraca list(2, 4). Chciałbym, żeby powrócił list(a = 2, b = 4).

Co więcej, czy istnieje sposób dostępu do nazwy z wnętrza pętli?

(nie jestem zainteresowany w roztworze, który przypisuje nazwy po pętli foreach.)

Pozdrowienia

+2

Nie jestem pewien, czy 'foreach' ma taką funkcję. Możesz jednak zmienić swoją pętlę na 'foreach (i = seq_along (foo)) {x <- foo [[i]]; ...} 'co pozwoli ci uzyskać dostęp do nazwy każdego elementu przez' names (foo) [i] ' – konvas

+0

Możesz również użyć' x = Map (struktura, .Data = lapply (foo, list), names = names (foo)) ', aby uzyskać nazwy wewnątrz pętli, tak jakby pętla używała' ['zamiast' [['aby uzyskać dostęp do elementów' foo'. –

Odpowiedz

9

używałem swoje rozwiązanie aż musiałem użyć zagnieżdżonego foreach (z operatorem %:%). Wpadłem na to:

foo <- list(a = 1, b = 2) 
bar <- foreach (x = foo, .final = function(x) setNames(x, names(foo))) %do% { 
    x * 2 
    } 

Sztuką jest wykorzystanie .final argument (który jest funkcją stosowanej raz na wynik końcowy), aby ustawić nazwy. Jest to ładniejsze, ponieważ nie używa zmiennej tymczasowej i jest ogólnie czystsze. Działa z listami zagnieżdżonymi, dzięki czemu można zachować nazwy na kilku warstwach struktury.

Należy zauważyć, że działa to poprawnie tylko wtedy, gdy foreach ma argument .inorder=T (który jest domyślny).

3

Dzięki za swoimi zaleceniami. To właśnie wymyśliłem:

foo <- list(a = 1, b = 2) 
bar <- foreach (x = foo, n = names(foo), .combine = c) %do% { 
    rv <- list() 
    rv[[n]] <- x * 2 
    rv 
}