【问题标题】:Dangerous for loop idiom?危险的循环习语?
【发布时间】:2011-11-08 15:55:19
【问题描述】:

An Introduction to R为例

xc <- split(x, ind)
yc <- split(y, ind)
for (i in 1:length(yc)) {
    plot(xc[[i]], yc[[i]])
    abline(lsfit(xc[[i]], yc[[i]]))
}

似乎for(i in 1:length(yc)) { ... 是在您需要当前索引句柄的情况下迭代列表或向量的惯用语。然而,这在空列表的情况下会中断,因为 1:0 不是空向量。当您不能保证非空列表时,我应该使用什么习语来迭代列表/向量索引?我在想if(length(yc)) for(i in 1:length(yc)) { ... 但有更好的方法吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    您正在寻找seq_along

    > seq_along(as.list(1:2))
    [1] 1 2
    > seq_along(list())
    integer(0)
    

    【讨论】:

    • 正是我想要的
    【解决方案2】:

    你可以使用seq_along:

    for(i in seq_along(yc)) {...}
    

    我很确定这绕过了问题并且应该会快一点。

    【讨论】:

      【解决方案3】:

      “The R Inferno”的第 75 页介绍了这个问题:http://www.burns-stat.com/pages/Tutor/R_inferno.pdf

      它还告诉您其他一些使循环出错的方法。

      【讨论】:

      • 欢迎来到 StackOverflow!你会发现 R inferno 在这里备受推崇。这是一个很好的资源,谢谢!
      【解决方案4】:

      对于任何偶然发现这一点的人——如果您想要一个基于可能为零长度的索引向量,而不是另一个向量,您可以安全地使用seq(1, length.out = L),其中 L 可以是任何非负整数。如果L == 0,则为您提供integer(0),否则为1:L

      当然,如果L == length(something),这里给出的其他解决方案会更简洁,但我遇到了一个问题,情况并非如此,所以我想我会把它写下来给后代。

      还有seq(1, length.out = L)可以简写为seq_len(L),按照?seq的说法更快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-04
        • 1970-01-01
        • 2013-03-21
        • 2015-08-13
        • 2010-12-10
        • 2015-07-11
        • 2014-07-11
        • 2019-04-26
        相关资源
        最近更新 更多