Вариант ответа @Cath с использованием рекурсивной функции, я не ожидаю, что он будет быстрее, чем простой цикл wile, это ради образовательной цели (будет разбито на большие векторы, r рассмотрит бесконечную рекурсию в какой-то момент):
cT2 <- function(vec, buffer, index = 1) {
if (!is.na(first_TRUE <- which(vec)[index])) {
vec[(first_TRUE+1):min((first_TRUE+buffer), length(vec))] <- FALSE
vec <- cT2(vec,buffer, index+1)
}
vec
}
Из любопытства пока небольшой тест всех решений (мой системный сбой с большим вектором, я не разбирался в том, какая функция вызвала сбой, я подозреваю мой):
library(microbenchmark)
set.seed(123)
vec <- sample(c(TRUE,FALSE),1e4,TRUE)
microbenchmark(changeTRUE(vec,3),cT2(vec,3),changeTRUE2(vec,3),times=10)
Результаты:
Unit: milliseconds
expr min lq mean median uq max neval
changeTRUE(vec, 3) 64.58125 65.36158 67.4990 66.26165 67.70284 73.94888 10
cT2(vec, 3) 75.84567 81.25721 111.0525 122.09651 124.63022 134.54896 10
changeTRUE2(vec, 3) 179.11084 185.51882 201.1573 193.79123 217.79790 234.92004 10