I have
txt <- "{a} is to {b} what {c} is to {d}"
key <- c(a='apple', b='banana', c='chair', d='door')
fun <- function(x) key[x]
and I would like to quickly convert txt
according to key
into:
"apple is to banana what chair is to door"
I know I can repeatedly use gsub
(or similar) like this:
for (v in names(key)) txt <- gsub(sprintf('{%s}',v), fun(v), txt, fixed = TRUE)
txt
# [1] "apple is to banana what chair is to door"
but my txt
and key
are very long so the above is problematic. I would like to know if there are faster methods like:
gsub('\\{(a|b|c|d)\\}', fun(...), txt, fixed = TRUE) # Does not work
Is it possible? Thanks.
CodePudding user response:
We could use glue
after creating the elements of key as objects
list2env(as.list(key), .GlobalEnv)
glue::glue(txt)
-output
apple is to banana what chair is to door
If we don't want to create objects in the global env, an option is also to add the key[
with gsub
inside the {}
and then use glue
glue::glue(gsub("\\{([^}] )\\}", "{key['\\1']}", txt))
apple is to banana what chair is to door
Or as @Robert Hacken mentioned in the comments, the .envir
would be more compact
glue::glue(txt, .envir=as.list(key))
apple is to banana what chair is to door
CodePudding user response:
With mgsub::mgsub
:
names(key) <- paste0("\\{", names(key), "\\}")
mgsub::mgsub(txt, names(key), key)
#[1] "apple is to banana what chair is to door"
CodePudding user response:
With glue_data()
:
library(glue)
glue_data(key, txt)
# apple is to banana what chair is to door