作为指南,我更喜欢使用lapply或*ply(来自plyr)在列表的元素上应用函数,而不是明确地迭代它们。但是,当我需要一次处理多个列表时,这种方法就不起作用了。当函数需要多个参数时,通常我会使用循环。
我想知道是否有更干净、仍然具有功能性质的构造方法。一种可能的方法是定义一个类似于Python中的zip(x,y)函数,它接受输入列表,并返回一个列表,其第i个元素是list(x, y),然后将该列表应用于函数。但我的问题是,我是否正在使用最清晰的方法。我不担心性能优化,而是关注代码的清晰度和优雅性。
下面是一个简单的示例:
我想知道是否有更干净、仍然具有功能性质的构造方法。一种可能的方法是定义一个类似于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
...
plyr
的函数族,包括m*ply
函数。 - Marek