2012-04-26 10 views
19

Esiste una funzione che può essere un'alternativa all'incolla? Vorrei sapere se qualcosa di simile esiste in R:Funzione alternativa per incollare

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

risposta

25

frankc e DWin hanno ragione a puntare a sprintf().

Se per qualche motivo le parti di ricambio in realtà sarà sotto forma di un vettore (cioè c("Tom", "day")), è possibile utilizzare do.call() di passarli 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

Penso che si sta cercando sprintf.

In particolare:

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

in particolare 'sprintf (" Ciao% s, buonissimo% s! "," Tom "," giorno ")' (inserire un * vettore * di valori sarebbe un po 'più complicato) –

+3

per quello che è vale 'sprintf' è nella sezione * Vedi anche * di'? paste' (!!) –

+7

Leggere i file della guida è imbrogliare! –

21

La funzione sprintf è un approccio come altri hanno detto, qui è un altro approccio utilizzando il pacchetto gsubfn:

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

molto perlish, grazie! – flodel

+0

per fn $ paste to work, le variabili devono essere variabili globali qui, c'è un modo per usare fn $ paste con le variabili locali myfunction <- function (X) {fn $ paste ("Hello $ X")} .. Ho davvero bisogno di qualcosa del genere :-) – MadSeb

+0

Se stai usando gli argomenti di una funzione, sembra che la funzione sprintf possa funzionare. Se vuoi che l'utente sia in grado di fornire la stringa, ma la tua funzione ha un insieme specifico di variabili che potrebbero usare, puoi semplicemente fare una serie di chiamate a gsub (o gsubfn) per sostituire l'istanza possibile di $ chi o $ tempo. Questo è l'approccio utilizzato dal pacchetto blockrand (funzione plot.blockrand). –

17

il pacchetto whisker fa molto bene, e merita più ampia appreciatio n:

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

+1, bella funzione.Suppongo che l'ordine nell'elenco non sia importante? Uno svantaggio di usare questo in un pacchetto sarebbe che introdurrebbe una dipendenza dal pacchetto whisker. –

+0

Se si è veramente preoccupati delle dipendenze, è possibile modificare (gsubfn) e salvarlo come una nuova funzione. Se stai già utilizzando stringr, puoi provare questa funzione (http://blog.aboutwilson.net/posts/2014-04/string-interpolation-in-r/) il cui scopo corrisponde esattamente al tuo intento. – ideamotor

1

Con la versione 1.1.0 (release CRAN su 2016/08/19), il pacchetto stringr ha acquisito una funzione di interpolazione di stringhe str_interp().

Con str_interp() i seguenti casi d'uso sono possibili:

variabili definite nell'ambiente

v1 <- "Tom" 
v2 <- "day" 
stringr::str_interp("Hi ${v1}, Have a very nice ${v2} !") 
#[1] "Hi Tom, Have a very nice day !" 

variabili fornite in un elenco di nome come parametro di

stringr::str_interp(
    "Hi ${v1}, Have a very nice ${v2} !", 
    list("v1" = "Tom", "v2" = "day")) 
#[1] "Hi Tom, Have a very nice day !" 

Variabili definita in un vettore

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

noti che il vettore value può contenere solo dati di un tipo (un elenco è più flessibile) ei dati vengono inseriti nell'ordine in cui sono forniti.