Это вопрос функционального программирования с использованием пакета purrrr. Я точно знаю, как сформулировать этот вопрос, но простой пример покажет, чего я пытаюсь достичь.
У меня есть строка «ABCDEF», и у меня есть список списков с регулярными выражениями и заменами для сопоставления и замены:
subs = list(
A = list(regex = "A", sub = "a"),
B = list(regex = "B", sub = "b"),
C = list(regex = "C", sub = "c")
)
Что я хочу сделать, так это взять строку и применить замены с stringr::str_replace_all
одну за другой.
"ABCDEF" %>%
str_replace_all(subs$A$regex, subs$A$sub) %>%
str_replace_all(subs$B$regex, subs$B$sub) %>%
str_replace_all(subs$C$regex, subs$C$sub)
# "abcDEF"
Есть ли расширение reduce
или другая функция более высокого порядка, которую я могу использовать для этого? Я знаю, что этого можно добиться, перебирая список замен и изменяя строку на месте, но я ищу функциональную конструкцию.
Так что в идеале должна быть какая-то функция более высокого порядка hof(.init, .x, .f, ...)
, чтобы я мог рекурсивно применить функцию к строке следующим образом:
hof(.init = "ABCDEF", .x = subs, ~ str_replace_all(.init, .x$regex, .x$sub))
Любая помощь или мысли будут очень признательны!
Reduce(function(x, args) chartr(args$regex, args$sub, x), subs, init = "ABCDEF")
- person alexis_laz   schedule 06.11.2017