Skip to content

Commit 4ac3be1

Browse files
committed
Vectorise fix_replacement
Fixes hadley/r4ds#278
1 parent 918fec2 commit 4ac3be1

File tree

2 files changed

+10
-1
lines changed

2 files changed

+10
-1
lines changed

R/replace.r

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ str_replace <- function(string, pattern, replacement) {
5555
#' @rdname str_replace
5656
str_replace_all <- function(string, pattern, replacement) {
5757
if (!is.null(names(pattern))) {
58+
vec <- FALSE
5859
replacement <- unname(pattern)
5960
pattern <- names(pattern)
60-
vec <- FALSE
6161
} else {
6262
vec <- TRUE
6363
}
@@ -75,6 +75,10 @@ str_replace_all <- function(string, pattern, replacement) {
7575
}
7676

7777
fix_replacement <- function(x) {
78+
vapply(x, fix_replacement_one, character(1), USE.NAMES = FALSE)
79+
}
80+
81+
fix_replacement_one <- function(x) {
7882
escape_dollar <- function(x) if (x == "$") "\\$" else x
7983

8084
chars <- str_split(x, "")[[1]]

tests/testthat/test-replace.r

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ test_that("replacement strings with capture groups refs and dollar signs work",
3434
expect_equal(str_replace("aba", "(b)", "\\\\1$\\1$\\\\1"), "a\\1$b$\\1a")
3535
})
3636

37+
test_that("can replace multiple matches", {
38+
x <- c("a1", "b2")
39+
y <- str_replace_all(x, c("a" = "1", "b" = "2"))
40+
expect_equal(y, c("11", "22"))
41+
})
3742

3843
# fix_replacement ---------------------------------------------------------
3944

0 commit comments

Comments
 (0)