Использование purrr :: redu2 для репликации поведения вложенных вызовов gsub - PullRequest
0 голосов
/ 29 мая 2018

Пример строки:

tst_str <- c("abc", "123", "klm", "lop")

Я хотел бы сделать следующие замены:

  • abc -> za12
  • 123 -> poi
  • klm -> uyt

Желаемые результаты

Простое вложение вызовов gsub дает результат:

gsub(
    pattern = "abc",
    replacement = "za12",
    x = gsub(
        pattern = "123",
        replacement = "poi",
        x = gsub(
            pattern = "klm",
            replacement = "uyt",
            x = tst_str
        )
    )
)
# [1] "za12" "poi"  "uyt"  "lop" 

Проблема

Iхотел бы получить идентичные результаты, используя функции purrr::map* или purrr::reduce.Сначала я использовал purrr::reduce2

purrr::reduce2(
    .x = c("abc", "123", "klm"),
    .y = c("za12", "poi", "uyt"),
    .f = function(x, y, init) {
        gsub(pattern = x,
             replacement = y,
             x = init)
    },
    .init = tst_str
)

Очевидно, что это неправильный способ сделать это:

Предупреждающее сообщение: в gsub (pattern = x,replace = y, x = init):
аргумент 'pattern' имеет длину> 1, и будет использоваться только первый элемент


Примечания

1 Ответ

0 голосов
/ 29 мая 2018

У вас правильная идея, попробуйте reduce2 с stringr::str_replace():

library(purrr)
library(stringr)

tst_str <- c("abc", "123", "klm", "lop")
replacements <- c("za12", "poi", "uyt")
patterns <-  c("abc", "123", "klm")
reduce2(patterns, replacements, str_replace, .init=tst_str)

[1] "za12" "poi"  "uyt"  "lop" 

Обратите внимание, что .f в reduce2() просто требуется функция, которая принимает 3 аргумента,На самом деле вам не нужно явно передавать их, reduce позаботится об этом.

Поочередно (хотя и не более высокого порядка):

names(replacements) <- patterns
str_replace_all(tst_str, replacements)
...