В качестве руководства я предпочитаю применять функции к элементам списка, используя 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
...