Как плавно переключиться с qdap :: mgsub () на textclean :: mgsub ()? - PullRequest
0 голосов
/ 10 октября 2018

Из-за проблем с выпуском R мне нужно переключиться между qdap::mgsub() и textclean::mgsub().Функции почти одинаковы, за исключением порядка аргументов:

qdap::mgsub(pattern,replacement,x)
textclean::mgsub(x,pattern,replacement)

У меня много кода, где я использую qdap::mgsub().К сожалению, я не правильно именую аргументы, когда передаю их в функцию.Поэтому мне нужно изменить их порядок, чтобы можно было использовать textclean :: mgsub ().

Существует ли (программно) элегантный способ переключения между этими двумя функциями без изменения порядкааргументы?

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Обдумав ответ @ duckmayr, я нашел другое решение для моего вопроса:

Сначала запустите эту функцию:

reorder_mgsub <- function(pattern,replacement,x){
  output <- textclean::mgsub(x,pattern,replacement)
  return(output)
}

Второе: найдите и замените qdap::mgsub на reorder_mgsub

Это решение может быть менее элегантным, потому что я должен сделать шаг 2 вручную, но для меня это работает очень хорошо.

0 голосов
/ 14 декабря 2018

Ну, вы также можете переназначить исходную функцию в пакете в соответствии с вашим кодом.

То есть, используя исходный код mgsub,

reorder_mgsub <- function(pattern,replacement,x, leadspace = FALSE, trailspace = FALSE, 
fixed = TRUE, trim = FALSE, order.pattern = fixed, safe = FALSE, 
...){
    if (!is.null(list(...)$ignore.case) & fixed) {
        warning(paste0("`ignore.case = TRUE` can't be used with `fixed = TRUE`.\n", 
            "Do you want to set `fixed = FALSE`?"), call. = FALSE)
    }
    if (safe) {
        return(mgsub_regex_safe(x = x, pattern = pattern, replacement = replacement, 
            ...))
    }
    if (leadspace | trailspace) {
        replacement <- spaste(replacement, trailing = trailspace, 
            leading = leadspace)
    }
    if (fixed && order.pattern) {
        ord <- rev(order(nchar(pattern)))
        pattern <- pattern[ord]
        if (length(replacement) != 1) 
            replacement <- replacement[ord]
    }
    if (length(replacement) == 1) {
        replacement <- rep(replacement, length(pattern))
    }
    if (any(!nzchar(pattern))) {
        good_apples <- which(nzchar(pattern))
        pattern <- pattern[good_apples]
        replacement <- replacement[good_apples]
        warning(paste0("Empty pattern found (i.e., `pattern = \"\"`).\n", 
            "This pattern and replacement have been removed."), 
            call. = FALSE)
    }
    for (i in seq_along(pattern)) {
        x <- gsub(pattern[i], replacement[i], x, fixed = fixed, 
            ...)
    }
    if (trim) {
        x <- gsub("\\s+", " ", gsub("^\\s+|\\s+$", "", x, perl = TRUE), 
            perl = TRUE)
    }
    x
}

С последующим

assignInNamespace('mgsub', reorder_mgsub, 'textclean')

, который должен назначать вашу обновленную функцию пространству имен пакета textclean, и любой код, который использует textclean::mgsub, теперь будет использовать вашу обновленную функцию.Таким образом, нет необходимости менять весь код.

0 голосов
/ 10 октября 2018

Вы можете использовать регулярное выражение для замены вхождений в тексте каждого файла, в котором вы вызываете старую функцию, используя функцию, подобную следующей:

replace_mgsub <- function(path) {
    file_text <- readr::read_file(path)
    file_text <- gsub("qdap::mgsub\\(([^, ]+) *, *([^, ]+) *, *([^\\)]) *\\)",
                      "textclean::mgsub\\(\\3, \\1, \\2\\)", file_text)
    readr::write_file(file_text, path)
}

, которую вы затем вызываете для каждого соответствующегоpath (я предполагаю, что здесь вы знаете список файлов, для которых требуется вызвать функцию; если нет, прокомментируйте ниже, и я могу добавить кое-что к этому).Вот демонстрация части функции gsub():

file_text <- "qdap::mgsub(pattern,replacement,x)"
cat(gsub("qdap::mgsub\\(([^, ]+) *, *([^, ]+) *, *([^\\)]) *\\)",
         "textclean::mgsub\\(\\3, \\1, \\2\\)", file_text))
#> textclean::mgsub(x, pattern, replacement)
file_text <- "# I'll have in this part some irrelevant code
# to show it won't interfere with that
y = rnorm(1000)
qdap::mgsub(pattern,replacement,x)
z = rnorm(10)
# And also demonstrate multiple occurrences of the function
# as well as illustrate that it doesn't matter if you have spaces
# between comma separated arguments
qdap::mgsub(pattern, replacement, x)"
cat(gsub("qdap::mgsub\\(([^, ]+) *, *([^, ]+) *, *([^\\)]) *\\)",
         "textclean::mgsub\\(\\3, \\1, \\2\\)", file_text))
#> # I'll have in this part some irrelevant code
#> # to show it won't interfere with that
#> y = rnorm(1000)
#> textclean::mgsub(x, pattern, replacement)
#> z = rnorm(10)
#> # And also demonstrate multiple occurrences of the function
#> # as well as illustrate that it doesn't matter if you have spaces
#> # between comma separated arguments
#> textclean::mgsub(x, pattern, replacement)
...