какой элемент списка обрабатывается при использовании snowfall :: sfLapply? - PullRequest
8 голосов
/ 12 ноября 2010

Предположим, у нас есть список (mylist), который используется в качестве входного объекта для функции lapply.Есть ли способ узнать, какой элемент в mylist оценивается?Этот метод должен работать и на lapply и snowfall::sfApply (и, возможно, другие применимы к членам семьи).

На в чате , Гэвин Симпсон предложил следующий метод.Это прекрасно работает для lapply, но не так сильно для sfApply.Я хотел бы избежать дополнительных пакетов или возиться со списком.Любые предложения?

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]]"

Это параллельная версия, которая не сокращает его.

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()

Ответы [ 2 ]

3 голосов
/ 12 ноября 2010

Я думаю, вам придется использовать решение / предложение Шейна в этом сеансе чата. Сохраните ваши объекты в списке так, чтобы каждый компонент верхнего списка содержал компонент с именем или идентификатором или экспериментом, содержащимся в этом компоненте списка, а также компонент, содержащий объект, который вы хотите обработать:

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))

Итак, мы имеем следующую структуру:

> 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

В следующей функции есть что-то вроде первой строки, за которой следует

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

Что будет делать это:

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

Что может сработать при снегопаде.

2 голосов
/ 12 ноября 2010

Я также мог бы изменить атрибуты следующим образом.

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)

(и параллельная версия)

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)
...