使用snowfall :: sfLapply时正在处理哪个列表元素?

Rom*_*rik 8 parallel-processing r list apply lapply

假设我们有一个list(mylist)用作lapply函数的输入对象.有没有办法知道mylist正在评估哪个元素?该方法应该起作用,lapply并且snowfall::sfApply(也可能是其他人也适用于家庭成员).

聊天时,Gavin Simpson提出了以下方法.这很有用,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]]"
Run Code Online (Sandbox Code Playgroud)

这是没有削减它的并行版本.

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()
Run Code Online (Sandbox Code Playgroud)

Rei*_*son 4

我认为您将不得不在该聊天会话中使用谢恩的解决方案/建议。将对象存储在列表中,以便顶部列表的每个组件都包含一个具有该列表组件中包含的名称或 ID 或实验的组件,以及包含要处理的对象的组件:

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))
Run Code Online (Sandbox Code Playgroud)

所以我们有以下结构:

> 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
Run Code Online (Sandbox Code Playgroud)

它们的内容类似于以下函数中的第一行,后面是您的

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

哪个会这样做:

> res <- lapply(obj, foo)
Processing Component: 1
Processing Component: 2
Processing Component: 3
Processing Component: 4
Processing Component: 5
Run Code Online (Sandbox Code Playgroud)

这可能对降雪有效。