索引迭代习惯用语

10

在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为空时没有元素的序列,但我现在记不起来了。你使用什么习惯用语?

有没有优雅的方式将空列表转换为 False?

1个回答

12

当你想要操作的对象为空时,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 - Sim
1
但是,如果您不需要索引变量,只想循环遍历某些元素,则lapply/sapply/vapply或plyr包中的某些内容可能更加优雅。 - Spacedman
@Spacedman 很正确,这绝对是原帖作者应该牢记的事情。 - Dason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接