我想遍历列表并使用其第n个元素,但是列表可以为空:
l <- list()
for(i in 1:length(l)) a <- l[[i]]
如果列表包含1个元素,则一切正常。
但是,如果列表为空,则length(l)等于零,因此循环将尝试运行两次并将i从1倒数到0。这将引发错误,因为l[[1]]
不存在:>
> Error in l[[i]] : subscript out of bounds
有没有比检查length(l)是否大于零更好的跳过for循环的方法?
答案 0 :(得分:2)
您偶然发现了R中的“最佳实践”课程。通常,人们建议您将for循环编写为
for (i in seq_along(obj))
而不是
for (i in 1:length(obj))
正是出于这个原因。 seq_along(list())
将返回integer(0)
,从而完全跳过循环。
如果只有长度(可能为零),则还有seq_len
选项:
for (i in seq_len(x))
其中seq_len()
在x = 0
时将做正确的事情,并且如果返回x <0
,则将返回错误,这通常是您想要的。