【问题标题】:Index iteration idiom索引迭代习语
【发布时间】:2012-08-07 08:07:27
【问题描述】:

在迭代集合的索引值时,以下代码在 SO 上很常见:

for (i in 1:length(x)) {
  # ...
}

当集合为空时,代码行为异常,因为 1:length(x) 变为 1:0,这为 i 提供了值 10

iterate <- function(x) {
    for (i in 1:length(x)) {
      cat('x[[', i, ']] is', x[[i]], '\n')
    }
}

> iterate(c(1,2,3))
x[[ 1 ]] is 1 
x[[ 2 ]] is 2 
x[[ 3 ]] is 3 

> iterate(c())
x[[ 1 ]] is  
x[[ 0 ]] is

我记得当x 为空时,我看到一个优雅的习惯用法来定义一个没有元素的序列,但我不记得了。你用什么成语?

【问题讨论】:

    标签: r iteration idioms


    【解决方案1】:

    当您感兴趣的对象为空时,seqseq_along 会为您提供更合理的信息。

    > x <- NULL
    > seq(x)
    integer(0)
    > seq_along(x)
    integer(0)
    > x <- rnorm(5)
    > seq(x)
    [1] 1 2 3 4 5
    > seq_along(x)
    [1] 1 2 3 4 5
    

    【讨论】:

    • 完美,seq_along 是我看到的成语。
    • 但是,如果您不需要索引变量并且只想遍历某些元素,那么 lapply/sapply/vapply 或 plyr 包中的某个元素可能会更优雅。
    • @Spacedman 非常正确,这绝对是 OP 应该牢记的。
    猜你喜欢
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 2011-07-23
    • 2013-07-05
    • 2020-08-11
    • 2014-01-23
    相关资源
    最近更新 更多