str_replace_all 不是一次全部迭代地替换命名向量元素

bio*_*iha 7 r str-replace stringr

假设我有一个长字符串:pneumonoultramicroscopicsilicovolcanoconiosis。我想stringr::str_replace_all用其他字母替换某些字母。根据文档,str_replace_all可以采用命名向量并用值替换名称。这适用于 1 次替换,但对于多次替换,它似乎是迭代进行的,因此结果是对上一次迭代的替换。我不确定这是预期的行为。

library(tidyverse)
text_string = "developer"
text_string %>% 
  str_replace_all(c(e ="X")) #this works fine
[1] "dXvXlopXr"
text_string %>% 
  str_replace_all(c(e ="p", p = "e")) #not intended behaviour
[1] "develoeer"
Run Code Online (Sandbox Code Playgroud)

想要的结果:

[1] "dpvploepr"
Run Code Online (Sandbox Code Playgroud)

我通过引入一个新角色得到:

text_string %>% 
  str_replace_all(c(e ="X", p = "e", X = "p"))
Run Code Online (Sandbox Code Playgroud)

这是一个可用的解决方法,但很难推广。这是一个错误还是我的期望错误?

我还希望能够同时用n 个其他字母替换n个字母,最好使用两个向量(如“旧”和“新”)或命名向量作为输入。

reprex 已编辑以便于人类阅读

Mar*_*ark 7

我正在开发一个包来处理这种类型的问题。这比qdap::mgsub函数更安全,因为它不依赖于占位符。它完全支持正则表达式作为匹配和替换。您提供一个命名列表,其中名称是要匹配的字符串,它们的值是替换字符串。

devtools::install_github("bmewing/mgsub")
library(mgsub)
mgsub("developer",list("e" ="p", "p" = "e"))
#> [1] "dpvploepr"

qdap::mgsub(c("e","p"),c("p","e"),"developer")
#> [1] "dpvploppr"
Run Code Online (Sandbox Code Playgroud)