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

How to repeat n elements of a list in a function in a for loop in R?

提问人:Amir Valizadeh 提问时间:9/23/2023 最后编辑:Amir Valizadeh 更新时间:9/23/2023 访问量:20

问:

因此,请考虑以下几点:

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”,我们如何自动化这个过程。

r 列表 函数 for 循环

评论

0赞 r2evans 9/23/2023
对循环有严格的要求吗?另外,我推断您的使用是您有一个任意函数,该函数恰好在此处与 R 保留字的名称相同。我无法定义甚至使用这样一个没有反引号的函数,如 in 和 then ,因为它是一个解析错误。为清楚起见,如果其他人有疑问,在表达式中使用不同的标记(例如 )可能会有所帮助。forfunction(data[1][i])function"function"`function` <- function(z) 1`function`(9)myfun(data[1][i])
0赞 Amir Valizadeh 9/23/2023
@r2evans 谢谢你的提示。我将“函数”名称更改为“myfunc”。严格来说,我不需要一个for循环来表示“n”的值。
0赞 r2evans 9/23/2023
好的,谢谢。既然你正在迭代,在我看来,只要和是相同的,才是安全的,否则你可能会错误地索引。也。。。这里有整个 -vs- 问题,当 时总是失败,因为 (和 ) 将始终返回 length-1 的 a,而不管 的值如何。也许你的意思是?1:length(data)data[1][i]length(data)length(data[[1]])[[[data[1][i]i > 1data[1]data[2]listidata[[2]][i]
0赞 Amir Valizadeh 9/23/2023
@r2evans是的,我认为你是对的。让我对代码进行一些更改,以便更好地解释我的问题。我在这里的基本意思是,我怎样才能得到一个列表的 n 个元素并将它们作为单独的对象放在一个函数中?
0赞 r2evans 9/23/2023
拥有更具体的功能可能会有所帮助?也许像 ?myfun <- function(...) paste(..., collapse=";")

答:

1赞 r2evans 9/23/2023 #1

我认为我们可以通过一些间接执行来解决这个问题。do.callMap

我将演示使用一个简单的函数,该函数只需将其 -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_len1:nnn > 0seq_len(2)1:2seq_len(0)1:0seq_len