如何在R中的for循环中重复函数中列表的n个元素?

gzjq41n4  于 2023-09-27  发布在  其他
关注(0)|答案(1)|浏览(93)

因此,请考虑以下情况:

data <- list(list(1, 2, 3, 4), list(1, 2, 3, 4, 5), list(1, 2, 3, 4), list(1, 2, 3, 4, 5))

现在,我想要一个for循环来获取n个“data”元素,并在它们的元素上执行一个函数。例如,如果n=3,则:

for(i in 1:length(data)) {
  myfunc(data[[1]][[i]], data[[2]][[i]], data[[3]][[i]])
}

如果n=2,则:

for(i in 1:length(data)) {
  myfunc(data[[1]][[i]], data[[2]][[i]])
}

如果n=1,则:

for(i in 1:length(data)) {
  myfunc(data[[1]][[i]])
}

所以基本上,我想知道如何给定一个“n”,我们可以自动化这个过程。

cqoc49vn

cqoc49vn1#

我认为我们可以通过使用do.call的一些间接执行和使用Map的逐元素迭代来解决这个问题。
我将使用一个简单的函数进行演示,该函数将简单地将其n-参数折叠成;分隔的字符串。

myfun <- function(...) paste(..., sep=";")

演示:

n <- 3
do.call(Map, c(list(f = myfun), data[seq_len(n)]))
# [[1]]
# [1] "1;4;7"   # result of `myfun(data[[1]][1], data[[2]][1], data[[3]][1])`
# [[2]]
# [1] "2;5;8"   # result of `myfun(data[[1]][2], data[[2]][2], data[[3]][2])`
# [[3]]
# [1] "3;6;9"   # result of `myfun(data[[1]][3], data[[2]][3], data[[3]][3])`
n <- 2
do.call(Map, c(list(f = myfun), data[seq_len(n)]))
# [[1]]
# [1] "1;4"     # result of `myfun(data[[1]][1], data[[2]][1])`
# [[2]]
# [1] "2;5"     # result of `myfun(data[[1]][2], data[[2]][2])`
# [[3]]
# [1] "3;6"     # result of `myfun(data[[1]][3], data[[2]][3])`
n <- 1
do.call(Map, c(list(f = myfun), data[seq_len(n)]))
# [[1]]
# [1] "1"       # result of `myfun(data[[1]][1])`
# [[2]]
# [1] "2"       # result of `myfun(data[[1]][2])`
# [[3]]
# [1] "3"       # result of `myfun(data[[1]][3])`

相关问题