Вот несколько альтернатив.Все используют только базу R. (2) использует Reduce
.(4) имеет самый короткий код.(3) кажется особенно простым.
1) внешний Вам на самом деле не нужно Reduce
для этого.Используйте outer
для создания логической матрицы, чья i-я строка и j-й столбец равны TRUE, если i-я функция, примененная к j-му элементу my_vec
, равна TRUE, а затем из этого используйте apply
, чтобы создать логический вектор, чей j-й элемент равен TRUE.если все элементы в j-м столбце имеют значение ИСТИНА и, наконец, индекс my_vec
тем самым.
call_fun <- function(fun, x) fun(x)
my_vec[ apply(outer(filter_list, my_vec, Vectorize(call_fun)), 2, all) ]
## "AAafszx223" "AA232fiserf"
2) Уменьшить С другой стороны, мы, безусловно, можем использовать Reduce
.Создайте функцию, которая принимает символьную строку и вызывает для нее каждую функцию в filter_list
, используя Reduce
для AND результатов.Затем используйте Filter
для извлечения тех элементов my_vec
, для которых применение этой функции дает TRUE.
Filter(function(x) Reduce(`&`, lapply(filter_list, do.call, list(x))), my_vec)
## [1] "AAafszx223" "AA232fiserf"
3) all На самом деле мы могли бы исключить Reduce
in (2) с использованием all
и почти идентичного кода.
Filter(function(x) all(sapply(filter_list, do.call, list(x))), my_vec)
## [1] "AAafszx223" "AA232fiserf"
4) Другой вариант заключается в следующем.sapply
создает матрицу, аналогичную, но транспонированную из матрицы в (1), и затем мы применяем all
к ее строкам и индексу.
my_vec[ apply(sapply(filter_list, do.call, list(my_vec)), 1, all) ]
[1] "AAafszx223" "AA232fiserf"
5) double sapply This oneиспользует идеи из вышеизложенного, но немного более симметричен в использовании двойного sapply
:
my_vec[ sapply(my_vec, function(x) all(sapply(filter_list, do.call, list(x)))) ]
## [1] "AAafszx223" "AA232fiserf"