Какой элемент списка обрабатывается при использовании снегопада :: SFLAPPLY?
-
09-10-2019 - |
Вопрос
Предположим, у нас есть список (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()
Решение
Я думаю, что вам придется использовать решение / предложение Шейна в этом чате. Храните свои объекты в списке, так как каждый компонент верхнего списка содержит компонент с именем или идентификатором или экспериментом, содержащимся в этом компонент, а также компонент, содержащий объект, который вы хотите обрабатывать:
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
Которые могут работать над снегопадом.
Другие советы
Я также мог изменить такие атрибуты так.
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)