R中的压缩列表

gap*_*ppy 16 r plyr lapply

作为指导,我更喜欢使用lapply或*ply(来自plyr)在列表元素上应用函数,而不是显式迭代它们.但是,当我必须一次处理一个列表时,这很有效.当函数接受多个参数时,我通常会进行一个循环.

我想知道是否有可能有一个更清洁的结构,仍然是功能性的.一种可能的方法是定义一个类似于Python的函数zip(x,y),它接受输入列表,并返回一个列表,其第i个元素是list(x,y),然后将该函数应用于这个清单.但我的问题是我是否使用最干净的方法.我并不担心性能优化,而是清晰/优雅.

以下是天真的例子.

        A <- as.list(0:9)
        B <- as.list(0:9)
        f <- function(x, y) x^2+y

        OUT <- list()
        for (n in 1:10) OUT[[n]] <- f(A[[n]], B[[n]])
        OUT
        [[1]]
        [1] 0

        [[2]]
        [1] 2

        ...
Run Code Online (Sandbox Code Playgroud)

这是压缩的示例(可以扩展到任意参数):

zip <- function(x, y){
    stopifnot(length(x)==length(y))
    z <- list()
    for (i in seq_along(x)){
        z[[i]] <- list(x[[i]], y[[i]]) 
    }
    z
}
E <- zip(A, B)

lapply(E, function(x) f(x[[1]], x[[2]]))

[[1]]
[1] 0

[[2]]
[1] 2

 ...
Run Code Online (Sandbox Code Playgroud)

Ben*_*ker 27

我想你正在寻找mapply:

   ‘mapply’ is a multivariate version of ‘sapply’.  ‘mapply’ applies
     ‘FUN’ to the first elements of each ...  argument, the second
     elements, the third elements, and so on.  Arguments are recycled
     if necessary.
Run Code Online (Sandbox Code Playgroud)

  • 还有`m*ply`函数的`plyr`系列. (3认同)
  • 而地图是mapply周围的薄包装 (2认同)