Использование 2:length(x)
работает нормально, если ваш x
имеет длину 2 или больше.Я полагаю, что ваше намерение состоит в том, чтобы получить все, кроме первого, и в этом случае все эти работы:
x <- 1:10
x[-1]
x[ seq_len(length(x))[-1] ]
tail(x, n=-1)
# [1] 2 3 4 5 6 7 8 9 10
Позвольте мне немного формализовать это, чтобы показать несколько вариантов (неправильных и правильных) и показать некоторые результаты.
allbutfirst <- function(n) {
sapply(list(
wrong1 = 2:length(n),
wrong2 = n[ 2:length(n) ],
right1 = n[ -1 ],
right2 = n[ seq_len(length(n))[-1] ],
right3 = tail(n, n=-1)
), paste, collapse = ",")
}
allbutlast <- function(m) {
sapply(list(
wrong1 = 1:(length(m)-1),
wrong2 = m[ 1:max(0, length(m)-1) ],
right1 = m[ -length(m) ],
right2 = m[ seq_len(max(0, length(m) - 1)) ],
right3 = head(m, n=-1)
), paste, collapse = ",")
}
allbutfirst(1:5)
# wrong1 wrong2 right1 right2 right3
# "2,3,4,5" "2,3,4,5" "2,3,4,5" "2,3,4,5" "2,3,4,5"
cat(paste(allbutfirst(1:5), collapse = "\n"))
# 2,3,4,5
# 2,3,4,5
# 2,3,4,5
# 2,3,4,5
# 2,3,4,5
cat(paste(allbutfirst(1), collapse = "\n"))
# 2,1
# NA,1
#
#
#
(метки wrong
присутствуют, потому что они ошибаются, когда длина не равна 2 и более ...)
"2,3,4,5"
означает, что возвращаемый вектор имеет длинучетыре, итерация от 2 до 5. "2,1"
означает длину два, уменьшив с 2 до 1 (когда мы не собирались это делать).Конечно, NA
просто не прав.
Пустые строки там актуальны: они означают, что их было меньше 2, и ничего не было возвращено (что мы и хотим).Чтобы вызвать пустые строки, я заменю их на ""
, просто для галочки.Но они пусты, как и должно быть.
Так что эта «таблица» обозначает различные методы
allbutfirst(x) allbutlast(x)
x <- 1:5 wrong1 2,3,4,5 1,2,3,4
wrong2 2,3,4,5 1,2,3,4
right1 2,3,4,5 1,2,3,4
right2 2,3,4,5 1,2,3,4
right3 2,3,4,5 1,2,3,4
Пока все хорошо, никакого вреда пока нет.
allbutfirst(x) allbutlast(x)
x <- 1 wrong1 2,1 1,0 <-- length 2, expected none
wrong2 NA,1 1 <-- 2 or 1, expected 0
right1 "" ""
right2 "" ""
right3 "" ""
x <- integer(0) wrong1 2,1,0 1,0,-1 <-- length 3? negative?
wrong2 NA,NA NA <-- all wrong
right1 "" ""
right2 "" ""
right3 "" ""
Мораль истории:
- использование
head
и tail
с отрицательный счет хорошо работает - использование
x[-1]
и x[-length(x)]
эквивалентен и все еще хорошо работает seq_len(max(0, ...))
- безопасный способ ведения дел;seq_len(0)
всегда будет пустым, 1:0
не будет.