Дословно скопировано из Патрика Бернса R Inferno p.41 (Я надеюсь, что это «добросовестное использование» - если кто-то возражает, я его удалю)
отрицательное ничто - это что-то
> x2 <- 1:4
> x2[-which(x2 == 3)]
[1] 1 2 4
Команда, приведенная выше, возвращаетвсе значения в x2
не равны 3.
> x2[-which(x2 == 5)]
numeric(0)
Надежда состоит в том, что приведенная выше команда возвращает все x2
, поскольку ни один элемент не равен 5. Реальность разрушит эту надежду.Вместо этого он возвращает вектор нулевой длины.Между этими двумя утверждениями есть тонкая разница:
x[]
x[numeric(0)]
Тонкая разница во входных данных, но нет тонкости в разнице в выходных данных.Существует как минимум три возможных решения исходной проблемы.
out <- which(x2 == 5)
if(length(out)) x2[-out] else x2
Другое решение заключается в использовании логических индексов:
x2[!(x2 %in% 5)]
Или, в некотором смысле, вы можете работать в обратном направлении:
x2[ setdiff(seq along(x2), which(x2 == 5)) ]