2012-04-26 10 views
19

¿Existe alguna función que pueda ser una alternativa para pegar? Me gustaría saber si algo así existe en R:Función alternativa para pegar

> buildString ("Hi {1}, Have a very nice {2} ! " , c("Tom", "day")) 

Respuesta

25

FrankC y Dwin tienen razón para señalarle a sprintf().

Si por alguna razón sus piezas de repuesto realmente estarán en la forma de un vector (es decir c("Tom", "day")), puede utilizar do.call() para pasarlos 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!" 
17

Creo que busca sprintf.

Específicamente:

sprintf("Hi %s, Have a very nice %s!","Tom","day") 
+4

específicamente 'sprintf (" Hola% s, tiene un muy buen% s! "," Tom "," día ")' (completar un * vector * de valores sería un poco más complicado) –

+3

por lo que es worth 'sprintf' está en la sección * See also * de'? paste' (!!) –

+7

¡Leer los archivos de ayuda es hacer trampa! –

21

La función sprintf es uno de los enfoques como otros han mencionado, aquí es otro enfoque utilizando el paquete de gsubfn:

> library(gsubfn) 
> who <- "Tom" 
> time <- "day" 
> fn$paste("Hi $who, have a nice $time") 
[1] "Hi Tom, have a nice day" 
+0

muy perlish, gracias! – flodel

+0

para fn $ pegar para trabajar, las variables tienen que ser variables globales aquí, ¿hay alguna forma de usar fn $ pegar con variables locales myfunction <- function (X) {fn $ paste ("Hello $ X")} ... Realmente necesito algo como esto :-) – MadSeb

+0

Si está utilizando los argumentos de una función, parece que la función sprintf funcionaría. Si desea que el usuario pueda suministrar la cadena, pero su función tiene un conjunto específico de variables que podrían usar, entonces puede hacer un conjunto de llamadas a gsub (o gsubfn) para sustituir una posible instancia de $ who o $ tiempo Este es el enfoque utilizado por el paquete blockrand (plot.blockrand function). –

17

el paquete whisker hace muy bien, y merece más amplia appreciatio n:

require(whisker) 
whisker.render ("Hi {{name}}, Have a very nice {{noun}} ! " , list(name="Tom", noun="day")) 
+0

+1, buena función.¿Supongo que el orden en la lista no importa? Una desventaja de usar esto en un paquete sería que introduciría una dependencia en el paquete de whisker. –

+0

Si está realmente preocupado por las dependencias, puede editar (gsubfn) y guardarlo como una nueva función. Si ya está utilizando stringr puede probar esta función (http://blog.aboutwilson.net/posts/2014-04/string-interpolation-in-r/) cuyo propósito coincide exactamente con su intención. – ideamotor

1

Con la versión 1.1.0 (CRAN liberación de 19.08.2016), el paquete stringr ha ganado una función de interpolación de cadenas str_interp().

Con str_interp() los siguientes casos de uso son posibles:

variables definidas en el entorno de

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 llamada 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 definida 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 !" 

Nota que el vector value sólo puede contener datos de un tipo (una lista es más flexible) y los datos se insertan en el orden en que se proporcionan.