2017-09-06 1 views
4

Ich habe eine URL, die ich eine Anfrage an die Verwendung von Datumsvariablen senden muss. Die https-Adresse verwendet die Datumsvariablen. Ich möchte die Daten der Adressleiste mit etwas wie dem Formatierungsoperator% in Python zuweisen. Hat R einen ähnlichen Operator oder muss ich mich auf paste() verlassen?Gibt es einen Zeichenkettenformatierungsoperator in R, der Pythons% ähnlich ist?

# Example variables 
year = "2008" 
mnth = "1" 
day = "31" 

Dies ist, was ich in Python 2.7 tun würde:

url = "https:.../KBOS/%s/%s/%s/DailyHistory.html" % (year, mnth, day) 

Oder mit .format() in 3 +.

Die einzige würde ich wissen, in R zu tun scheint ausführlich und stützt sich auf Paste:

url_start = "https:.../KBOS/" 
url_end = "/DailyHistory.html" 
paste(url_start, year, "/", mnth, "/", day, url_end) 

Gibt es einen besseren Weg, dies zu tun?

+0

Vielleicht etwas wie 'paste (url_start, einfügen (Jahr, mnth, Tag, sep ="/"), url_end)' – CPak

+0

Siehe https://stackoverflow.com/questions/17475803/sprintf-format-strings-reference-by-name/17476306#17476306 –

Antwort

13

Das Äquivalent in R sprintf ist:

year = "2008" 
mnth = "1" 
day = "31" 
url = sprintf("https:.../KBOS/%s/%s/%s/DailyHistory.html", year, mnth, day) 
#[1] "https:.../KBOS/2008/1/31/DailyHistory.html" 

Auch, obwohl ich denke, es ist zuviel des Guten ist, könnten Sie einen Operator selbst definieren.

`%--%` <- function(x, y) { 

    do.call(sprintf, c(list(x), y)) 

} 

"https:.../KBOS/%s/%s/%s/DailyHistory.html" %--% c(year, mnth, day) 
#[1] "https:.../KBOS/2008/1/31/DailyHistory.html" 
+3

Vielleicht lohnt sich auch ein Beispiel zur Veranschaulichung der Vektorisierung wie '" https: .../KBOS /% s /% s /% s/DailyHistory.html "% -% list (1999: 2000, mnth, day)" oder das Sprintf-Äquivalent. (Ich denke, in Python würden sie diese Art von Ding stattdessen wiederholen.) – Frank

5

Als Alternative zu sprintf, möchten Sie vielleicht glue auszuchecken.


library(glue) 

year = "2008" 
mnth = "1" 
day = "31" 
url = glue("https:.../KBOS/{year}/{mnth}/{day}/DailyHistory.html") 

url 

#> https:.../KBOS/2008/1/31/DailyHistory.html 
2

Das stringr Paket hat die str_interp() Funktion:

year = "2008" 
mnth = "1" 
day = "31" 
stringr::str_interp("https:.../KBOS/${year}/${mnth}/${day}/DailyHistory.html") 
[1] "https:.../KBOS/2008/1/31/DailyHistory.html" 

oder mit einer Liste (beachten Sie, dass jetzt numerische Werte übergeben werden):

stringr::str_interp("https:.../KBOS/${year}/${mnth}/${day}/DailyHistory.html", 
          list(year = 2008, mnth = 1, day = 31)) 
[1] "https:.../KBOS/2008/1/31/DailyHistory.html" 

BTW, können Richtlinien Formatierung auch, zum Beispiel übergeben werden, wenn die Monatsfeldern zwei Zeichen muss breit sein:

stringr::str_interp("https:.../KBOS/${year}/$[02i]{mnth}/${day}/DailyHistory.html", 
        list(year = 2008, mnth = 1, day = 31)) 
[1] "https:.../KBOS/2008/01/31/DailyHistory.html" 
Verwandte Themen