Нет эквивалента.Фактически, одна вещь, которая делает map
(и подобные функции) настолько превосходящими общие циклы с точки зрения читабельности, состоит в том, что они имеют абсолютно предсказуемое поведение: они будут выполнять функцию ровно один раз для каждого элемента, без исключений (кроме, э-э,если есть исключение: вы можете поднять условие через stop
для выполнения короткого замыкания, но это очень редко желательно).
Вместо этого ваше дело не требует map
, это требует чего-то вроде purrr::keep
или purrr::reduce
.
Думайте об этом так: map
, reduce
и т. Д. Являются абстракциями, которые соответствуют конкретным частным случаямболее общий цикл for
.Их цель - прояснить , какой особый случай обрабатывается.Как программист, ваша задача состоит в том, чтобы найти правильную абстракцию.
В вашем конкретном случае я бы, вероятно, полностью переписал бы оператор, используя dplyr, поэтому трудно найти «лучшее» мурлыканье:Лучшее решение не использовать мурлыкать.Тем не менее, вы можете использовать purrr::detect
следующим образом:
names(iris) %>%
detect(`==`, 'Sepal.Width') %>%
`[`(iris, .) %>%
head(2)
или
seq_along(iris) %>%
detect(~ names(iris[.x]) == 'Sepal.Width') %>%
`[`(iris, .) %>%
head(2)
... но на самом деле, вот dplyr для сравнения:
iris %>%
select(Sepal.Width) %>%
head(2)