R 中是否有一种优雅的方法可以跳过空元素的 for 循环?
Is there an elegant way in R to skip a for loop over an empty element?
我想遍历列表并处理它的第 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 循环?
您偶然发现了 "best practice" R 课程。通常,人们建议您将 for 循环编写为
for (i in seq_along(obj))
而不是
for (i in 1:length(obj))
正是因为这个原因。 seq_along(list())
将 return integer(0)
,完全跳过循环。
如果只有长度,也有seq_len
的选项,可能为零:
for (i in seq_len(x))
其中 seq_len()
会在 x = 0
时做正确的事情,而 return 会在 x <0
时出错,这通常是您想要的。
我想遍历列表并处理它的第 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 循环?
您偶然发现了 "best practice" R 课程。通常,人们建议您将 for 循环编写为
for (i in seq_along(obj))
而不是
for (i in 1:length(obj))
正是因为这个原因。 seq_along(list())
将 return integer(0)
,完全跳过循环。
如果只有长度,也有seq_len
的选项,可能为零:
for (i in seq_len(x))
其中 seq_len()
会在 x = 0
时做正确的事情,而 return 会在 x <0
时出错,这通常是您想要的。