提问人:Amir Valizadeh 提问时间:9/23/2023 最后编辑:Amir Valizadeh 更新时间:9/23/2023 访问量:20
如何在 R 的 for 循环中重复函数中列表的 n 个元素?
How to repeat n elements of a list in a function in a for loop in R?
问:
因此,请考虑以下几点:
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 个元素,并在它们的元素上执行一个函数。例如,如果 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”,我们如何自动化这个过程。
答:
1赞
r2evans
9/23/2023
#1
我认为我们可以通过一些间接执行来解决这个问题。do.call
Map
我将演示使用一个简单的函数,该函数只需将其 -arguments 折叠成 -delimited 字符串。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])`
评论
1赞
Amir Valizadeh
9/23/2023
是的!我认为 do.call、Map 和 seq_len 的组合是我一直在寻找的。谢谢!
0赞
r2evans
9/23/2023
顺便说一句,类似于;它的优点是何时以编程方式确定,并且您无法保证(即,并且相同,但非常不同)。使用只是一种针对程序化排序的防御技术。seq_len
1:n
n
n > 0
seq_len(2)
1:2
seq_len(0)
1:0
seq_len
评论
for
function(data[1][i])
function
"function"
`function` <- function(z) 1
`function`(9)
myfun(data[1][i])
1:length(data)
data[1][i]
length(data)
length(data[[1]])
[
[[
data[1][i]
i > 1
data[1]
data[2]
list
i
data[[2]][i]
myfun <- function(...) paste(..., collapse=";")