Опасен для петли идиома? - PullRequest
       3

Опасен для петли идиома?

6 голосов
/ 01 сентября 2011

на примере Введение в 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)) { ... но есть ли лучший способ?

Ответы [ 4 ]

11 голосов
/ 01 сентября 2011

Вы ищете seq_along.

> seq_along(as.list(1:2))
[1] 1 2
> seq_along(list())
integer(0)
7 голосов
/ 01 сентября 2011

Вы можете использовать seq_along:

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

Я уверен, что это обходит проблему , и должен быть чуть-чуть быстрее.

4 голосов
/ 02 сентября 2011

Этот вопрос рассматривается на странице 75 'The R Inferno': http://www.burns -stat.com / pages / Tutor / R_inferno.pdf

В нем рассказывается несколько другихспособы сделать вашу петлю неправильной.

0 голосов
/ 03 июля 2013

Для тех, кто случайно наткнулся на это - если вам нужен индексный вектор, основанный на возможной нулевой длине, а не на другом векторе, вы можете смело использовать seq(1, length.out = L), где L может быть любым неотрицательным целым числом.Это даст вам integer(0), если L == 0, и 1:L в противном случае.

Конечно, другие решения, приведенные здесь, более кратки, если L == length(something), но у меня была проблема, когда это не былослучай, поэтому я решил записать это для потомства.

Также seq(1, length.out = L) может быть сокращено до seq_len(L), что в соответствии с ?seq быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...