string - plastico - title python
FunciĆ³n alternativa para pegar. (5)
¿Hay alguna función que pueda ser una alternativa para pegar? Me gustaría saber si algo como esto existe en R:
> buildString ( "Hi {1}, Have a very nice {2} ! " , c("Tom", "day") )
Con la versión 1.1.0 (versión CRAN del 2016-08-19), el paquete stringr
obtuvo una función de interpolación de cadenas str_interp()
.
Con str_interp()
son posibles los siguientes casos de uso:
Variables definidas en el entorno.
v1 <- "Tom"
v2 <- "day"
stringr::str_interp("Hi ${v1}, Have a very nice ${v2} !")
#[1] "Hi Tom, Have a very nice day !"
Variables proporcionadas en una lista nombrada como parámetro
stringr::str_interp(
"Hi ${v1}, Have a very nice ${v2} !",
list("v1" = "Tom", "v2" = "day"))
#[1] "Hi Tom, Have a very nice day !"
Variables definidas en un vector.
values <- c("Tom", "day")
stringr::str_interp(
"Hi ${v1}, Have a very nice ${v2} !",
setNames(as.list(values), paste0("v", seq_along(values)))
)
#[1] "Hi Tom, Have a very nice day !"
Tenga en cuenta que el vector de value
solo puede contener datos de un tipo (una lista es más flexible) y los datos se insertan en el orden en que se proporcionan.
Creo que estás buscando sprintf.
Específicamente:
sprintf("Hi %s, Have a very nice %s!","Tom","day")
El paquete de whisker
hace muy bien y merece una apreciación más amplia:
require(whisker)
whisker.render ( "Hi {{name}}, Have a very nice {{noun}} ! " , list(name="Tom", noun="day") )
La función sprintf
es un enfoque, como han mencionado otros, aquí hay otro enfoque que utiliza el paquete gsubfn
:
> library(gsubfn)
> who <- "Tom"
> time <- "day"
> fn$paste("Hi $who, have a nice $time")
[1] "Hi Tom, have a nice day"
frankc y DWin tienen razón al señalarte a sprintf()
.
Si, por algún motivo, sus piezas de repuesto realmente estarán en forma de un vector (es decir, c("Tom", "day")
), puede usar do.call()
para pasarlas a sprintf()
:
string <- "Hi %s, Have a really nice %s!"
vals <- c("Tom", "day")
do.call(sprintf, as.list(c(string, vals)))
# [1] "Hi Tom, Have a really nice day!"