首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用snowfall::sfLapply时,哪个列表元素正在被处理?

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

Stack Overflow用户
提问于 2010-11-12 21:12:58
回答 2查看 2.1K关注 0票数 10

假设我们有一个用作lapply函数输入对象的列表(mylist)。有没有办法知道mylist中的哪个元素正在被计算?该方法应该也适用于lapplysnowfall::sfApply (可能还适用于家庭成员)。

chat上,加文·辛普森提出了以下方法。这对lapply很有效,但对sfApply就不是那么有效了。我希望避免额外的包或摆弄列表。有什么建议吗?

代码语言:javascript
复制
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]]"

这是并行版本,它不能解决这个问题。

代码语言:javascript
复制
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()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-12 21:41:21

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

代码语言:javascript
复制
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))

因此,我们有以下结构:

代码语言:javascript
复制
> 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

在下面的函数中有类似于第一行的内容,后面是您的

代码语言:javascript
复制
foo <- function(x) {
    writeLines(paste("Processing Component:", x$ID))
    sum(x$obj)
}

它将执行以下操作:

代码语言:javascript
复制
> res <- lapply(obj, foo)
Processing Component: 1
Processing Component: 2
Processing Component: 3
Processing Component: 4
Processing Component: 5

这可能会对降雪起作用。

票数 4
EN

Stack Overflow用户

发布于 2010-11-12 23:30:19

我也可以像这样修改属性。

代码语言:javascript
复制
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)

(和并行版本)

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4164960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档