Быстрое минимальное расстояние (интервал) между элементами 2 логических векторов (дубль 2)

Я задал связанный вопросВот но понял, что я слишком много времени тратил на вычисление этой сложной меры (и цель в том, чтобы использовать тест рандомизации, чтобы скорость была проблемой). Поэтому я решил сбросить вес и просто использовать минимальное расстояние между двумя мерами. Так что здесь у меня есть 2 вектора (в кадре данных для демонстрационных целей, но на самом деле это два вектора.

       x     y
1  FALSE  TRUE
2  FALSE FALSE
3   TRUE FALSE
4  FALSE FALSE
5  FALSE  TRUE
6  FALSE FALSE
7  FALSE FALSE
8   TRUE FALSE
9  FALSE  TRUE
10  TRUE  TRUE
11 FALSE FALSE
12 FALSE FALSE
13 FALSE FALSE
14 FALSE  TRUE
15  TRUE FALSE
16 FALSE FALSE
17  TRUE  TRUE
18 FALSE  TRUE
19 FALSE FALSE
20 FALSE  TRUE
21 FALSE FALSE
22 FALSE FALSE
23 FALSE FALSE
24 FALSE FALSE
25  TRUE FALSE

Здесь у меня есть некоторый код, разработанный для нахождения минимального расстояния, но мне нужно больше скорости (удаление ненужных вызовов и лучшая векторизация). Может быть, я не могу идти быстрее на базе R.

## MWE EXAMPLE: THE DATA
x <- y <- rep(FALSE, 25)
x[c(3, 8, 10, 15, 17, 25)] <- TRUE
y[c(1, 5, 9, 10, 14, 17, 18, 20)] <- TRUE

## Code to Find Distances
xw <- which(x)
yw <- which(y)

min_dist <- function(xw, yw) {
    unlist(lapply(xw, function(x) {
        min(abs(x - yw))
    }))
}

min_dist(xw, yw)

Есть ли способ улучшить производительность в базе R? С помощьюdplyr или жеdata.table?

Мои векторы намного длиннее (10000 + элементов).

редактировать скамейка Флоделя. flodel есть проблема, которую я ожидал в своем MWE, и я не уверен, как ее исправить. Проблема возникает, если любая позиция x меньше минимальной позиции y.

x <- y <- rep(FALSE, 25)
x[c(3, 8, 9, 15, 17, 25)] <- TRUE
y[c(5, 9, 10, 13, 15, 17, 19)] <- TRUE


xw <- which(x)
yw <- which(y)

flodel <- function(xw, yw) {
   i <- findInterval(xw, yw)
   pmin(xw - yw[i], yw[i+1L] - xw, na.rm = TRUE)
}

flodel(xw, yw)

## [1] -2 -1 -6 -2 -2 20
## Warning message:
## In xw - yw[i] :
##   longer object length is not a multiple of shorter object length

Ответы на вопрос(2)

Ваш ответ на вопрос