2010-11-12 12 views
7

Załóżmy, że mamy listę (mylist), która jest używana jako obiekt wejściowy dla funkcji lapply. Czy istnieje sposób na sprawdzenie, który element w mylist jest oceniany? Metoda powinna działać na lapply i snowfall::sfApply (i możliwe, że inni członkowie rodziny również).który element listy jest przetwarzany podczas używania opadów śniegu :: sfLapply?

Na chat Gavin Simpson zasugerował następującą metodę. Działa to świetnie dla lapply, ale nie tak bardzo dla sfApply. Chciałbym uniknąć dodatkowych paczek lub błądzenia się z listą. Jakieś sugestie?

mylist <- list(a = 1:10, b = 1:10) 
foo <- function(x) { 
    deparse(substitute(x)) 
} 
bar <- lapply(mylist, FUN = foo) 

> bar 
$a 
[1] "X[[1L]]" 

$b 
[1] "X[[2L]]" 

To jest wersja równoległa, która go nie tnie.

library(snowfall) 
sfInit(parallel = TRUE, cpus = 2, type = "SOCK") # I use 2 cores 

sfExport("foo", "mylist") 
bar.para <- sfLapply(x = mylist, fun = foo) 

> bar.para 
$a 
[1] "X[[1L]]" 

$b 
[1] "X[[1L]]" 

sfStop() 

Odpowiedz

3

Myślę, że będziesz musiał użyć rozwiązania/sugestii Shane'a podczas tej sesji czatu. Przechowywanie przedmiotów na liście tak, że każdy element górnej liście zawiera składnik o nazwie lub ID lub eksperymentu zawarty w tym składniku listy, a także komponent zawierający obiekt, który chcesz procesu:

obj <- list(list(ID = 1, obj = 1:10), list(ID = 2, obj = 1:10), 
      list(ID = 3, obj = 1:10), list(ID = 4, obj = 1:10), 
      list(ID = 5, obj = 1:10)) 

Więc mają następującą strukturę:

> str(obj) 
List of 5 
$ :List of 2 
    ..$ ID : num 1 
    ..$ obj: int [1:10] 1 2 3 4 5 6 7 8 9 10 
$ :List of 2 
    ..$ ID : num 2 
    ..$ obj: int [1:10] 1 2 3 4 5 6 7 8 9 10 
$ :List of 2 
    ..$ ID : num 3 
    ..$ obj: int [1:10] 1 2 3 4 5 6 7 8 9 10 
$ :List of 2 
    ..$ ID : num 4 
    ..$ obj: int [1:10] 1 2 3 4 5 6 7 8 9 10 
$ :List of 2 
    ..$ ID : num 5 
    ..$ obj: int [1:10] 1 2 3 4 5 6 7 8 9 10 

mają coś takiego w pierwszym wierszu w następującej funkcji, a następnie przez

foo <- function(x) { 
    writeLines(paste("Processing Component:", x$ID)) 
    sum(x$obj) 
} 

który zrób to:

> res <- lapply(obj, foo) 
Processing Component: 1 
Processing Component: 2 
Processing Component: 3 
Processing Component: 4 
Processing Component: 5 

Który może działać na śniegu.

2

Mogłabym także zmienić atrybuty takie jak to.

mylist <- list(a = 1:10, b = 1:10) 
attr(mylist[[1]], "seq") <- 1 
attr(mylist[[2]], "seq") <- 2 

foo <- function(x) { 
    writeLines(paste("Processing Component:", attributes(x))) 
} 
bar <- lapply(mylist, FUN = foo) 

(a wersja równoległa)

mylist <- list(a = 1:10, b = 1:10) 
attr(mylist[[1]], "seq") <- 1 
attr(mylist[[2]], "seq") <- 2 

foo <- function(x) { 
    x <- paste("Processing Component:", attributes(x)) 
} 
sfExport("mylist", "foo") 
bar <- sfLapply(mylist, fun = foo) 
+0

To wyglądało "źle" i na pewno wystarczy, gdy próbuję w ciekawy (MyList '[[1]]) <- 1 ', dostaję:' Błąd w 'attr <-' (' * tmp * ', value = 2): 2 argumenty przekazane do 'attr <-', które wymaga 3'. Myślę, że musisz podać nazwę dla atrybutu –

+0

@BondedDust zabawny, nie pamiętam tego NIE działa. Edytowałem dwa obraźliwe wiersze. –

Powiązane problemy