Единственные элементы M
, которые имеют значение, это те, которые находятся между вашими порогами, -0,5 и 10. Таким образом, мы избавимся от всего остального и разберем то, что осталось.Затем нам нужно взять разницу между элементами, смещенными на 2, и посмотреть, не превышает ли какой-либо из них порог разности 0,5:
M = c(-1.64, 1.99, 0.79, 1.72, 1.07, 2.12, 1.98, 0.12)
sub_m = sort(M[M >= -.5 & M <= 10])
any(tail(sub_m,-2) - head(sub_m,-2) <= 0.5)
# [1] TRUE
Мы можем обернуть это в удобную функцию:
foo = function(M) {
sub_m = sort(M[M >= -.5 & M <= 10])
any(tail(sub_m, -2) - head(sub_m, -2) <= 0.5)
}
foo(1:10)
# [1] FALSE
foo(M)
# [1] TRUE
Я бы порекомендовал проверить его на некоторых дополнительных случаях.Я написал функцию, которая возвращает logical
true или false, вы можете использовать as.integer
, если вы хотите получить числовой результат.Вы также можете параметризовать функцию для необязательного ввода различных порогов.
tail(sub_m, -2)
- все, кроме первых двух элементов sub_m
.head(sub_m, -2)
- это все, кроме двух последних элементов.Так что tail(sub_m,-2) - head(sub_m,-2)
- это векторизованный способ вычисления c(sub_m[3] - sub_m[1], sub_m[4] - sub_m[2], ...)
.