R: функциональный подход к нескольким последовательным gsub - PullRequest
0 голосов
/ 11 февраля 2019

Я какое-то время обдумывал это, пробуя множество вариантов map, Reduce и тому подобное, но пока безуспешно.

Я ищу функциональный, элегантный подход для замены последовательности gsub, как в

text_example <- c(
    "I'm sure dogs are the best", 
    "I won't, I can't think otherwise", 
    "We'll be happy to discuss about dogs",
    "cant do it today tho"
)

text_example %>%
    gsub(pattern = "'ll", replacement = " will") %>%
    gsub(pattern = "can'?t", replacement = "can not") %>%
    gsub(pattern = "won'?t", replacement = "will not") %>%
    gsub(pattern = "n't", replacement = " not") %>%
    gsub(pattern = "'m", replacement = " am") %>%
    gsub(pattern = "'s", replacement = " is") %>%
    gsub(pattern = "dog", replacement = "cat") %>%

На что-то вроде

text_example %>% 
    ???(dict$pattern, dict$replacement, gsub())

Где,ради воспроизводимого примера, dict может быть data.frame, например

dict <- structure(
    list(
      pattern = c("'ll", "can'?t", "won'?t", "n't", "'m", "'s", "dog"), 
      replacement = c(" will", "can not", "will not", " not", " am", " is", "cat")
    ), 
    row.names = c(NA, -7L), 
    class = "data.frame"
) 

(и я знаю, что выполненные замены могут быть некорректными с лингвистической точки зрения, но сейчас это не проблема)

Конечно, брутальный

for(i in seq(nrow(dict))) {

    text_example <- gsub(dict$pattern[i], dict$replacement[i], text_example)

}

сработает, и Я знаю, что существуют десятки библиотек, которые решают эту проблему с помощью определенной функции.Но я хочу понять, как справиться с рекурсиями и такими проблемами, как эта, простым и функциональным способом , стараясь держаться как можно ближе к базе R. Я люблю свои лямбды!

Заранее благодарю за помощь.

1 Ответ

0 голосов
/ 11 февраля 2019

Возможно, следующее делает то, что вы хотите.
Это вдохновлено Функциональное программирование , ссылка в вашем комментарии.
Мне не нравится вывод, хотя это список сстолько элементов, сколько строк в фрейме данных dict, и только последний является целым.

new_text <- function(pattern, replacement, text) {
  txt <- text
  function(pattern, replacement) {
    txt <<- gsub(pattern, replacement, txt)
    txt
  }
}

Replace <- new_text(p, r, text = text_example)

Map(Replace, as.list(dict[[1]]), as.list(dict[[2]]))
...