2013-07-04 15 views
9

In Python, è possibile specificare formati di stringa per nome (questo è naturalmente un esempio stupido):stringhe di formato sprintf: riferimento per nome?

parameters = {'label':'months', 'april':4,'may':5,'june':6} 
formatstring = '%(label)s: %(april)d %(may)d %(june)d' 
outputstring = formatstring % parameters 

(La notazione formatstring % parameters è il Python equivalente a do.call(sprintf,c(formatstring,as.list(parameters))) in R.)

La stringa di uscita sarebbe "months: 4, 5, 6". i parametri sono memorizzati come una coppia chiave-valore (che potrebbe essere chiamata un dizionario, una tabella hash o una lista con nome in varie lingue). Il formato stringa %(text)s consente di fare riferimento a quale elemento del dizionario (text) deve essere formattato in tale slot.

C'è qualcosa di equivalente in R, o hai trovato una buona soluzione?

+0

nel vostro interesse, non si deve presumere che tutti in grado di aiutarvi con R capisce Python. Spiega cosa fa il codice Python. – Roland

+0

questa [domanda] (http://stackoverflow.com/questions/13023274/how-to-do-printf-in-r) fornisce qualche utile background su "printf" in R. – TooTone

+0

Grazie a @Roland, ho aggiunto una spiegazione . – hatmatrix

risposta

13

1. Prova gsubfn nella gsubfn package:

library(gsubfn) 
parameters <- list(label = "months", april = 4, may = 5, june = 6) 

gsubfn("\\w+", parameters, "label: april, may, june") 

2. o prova fn$ dal medesimo pacchetto:

with(parameters, fn$identity("$label: $april, $may, $june")) 

3. Ecco una funzione infisso breve che trasforma una stringa di formato e un elenco di parametri in un sprintf e poi lo esegue:

library(gsubfn) 
`%format%` <- function(fmt, list) { 
    pat <- "%\\(([^)]*)\\)" 
    fmt2 <- gsub(pat, "%", fmt) 
    list2 <- list[strapplyc(fmt, pat)[[1]]] 
    do.call("sprintf", c(fmt2, list2)) 
} 

usare in questo modo:

> '%(label)s: %(april)d %(may)d %(june)d' %format% parameters 
[1] "months: 4 5 6" 
+0

Questo è bello, grazie. Sapevo che 'gsubfn' sarebbe stata la chiave per la soluzione. Sono stato un fan del tuo lavoro dai tempi di R-help. – hatmatrix

Problemi correlati