作为指导方针,我更喜欢使用 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
...
这是压缩示例(可以扩展到任意参数):
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
...