代码之家  ›  专栏  ›  技术社区  ›  Roman LuÅ¡trik

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

  •  8
  • Roman LuÅ¡trik  · 技术社区  · 14 年前

    假设我们有清单( mylist )用作 lapply 功能。有没有办法知道 正在评估?这个方法应该有效 snowfall::sfApply (可能还有其他人也适用于家庭成员)。

    chat ,加文·辛普森提出了以下方法。这对 但不是为了 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 回复  |  直到 14 年前
        1
  •  3
  •   Gavin Simpson    14 年前

    我想你在那次聊天中必须使用谢恩的解决方案/建议。将对象存储在列表中,使顶部列表的每个组件都包含一个名称、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))
    

    所以我们有如下结构:

    > 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
  •  2
  •   Roman LuÅ¡trik    10 年前

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

    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)