2013-07-04 11 views
9

W Pythonie można określić formaty ciąg nazwy (jest to oczywiście głupie przykład):ciągi w formacie sprintf: numeracja według nazwy?

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

(notacja formatstring % parameters jest równoważne Python do do.call(sprintf,c(formatstring,as.list(parameters))) w R.)

Ciąg wyjście będzie "months: 4, 5, 6". parametry są przechowywane jako para klucz-wartość (która może być nazwana słownikiem, hashtable lub nazwaną listą w różnych językach). Format ciągów znaków %(text)s pozwala określić, który element słownika (text) powinien zostać sformatowany w tym gnieździe.

Czy istnieje odpowiednik w R, czy też znalazłeś dobre rozwiązanie?

+0

we własnym interesie nie należy zakładać, że każdy może pomóc R rozumie Python. Wyjaśnij, co robi kod Pythona. – Roland

+0

to [pytanie] (http://stackoverflow.com/questions/13023274/how-to-do-printf-in-r) zapewnia pewne przydatne tło na "printf" w R. – TooTone

+0

Dzięki @Roland, dodałem wyjaśnienie . – hatmatrix

Odpowiedz

13

1. Spróbuj gsubfn w gsubfn package:

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

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

2. lub spróbuj fn$ z tego samego pakietu:

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

3. Oto krótka funkcja infix który przekształca ciąg formatu i listę parametrów do sprintf, a następnie uruchamia go:

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

Używaj go tak:

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

To jest piękne, dziękuję. Wiedziałem, że "gsubfn" będzie kluczem do rozwiązania. Jestem fanem twojej pracy od czasów R-help. – hatmatrix