2017-09-06 1 views
4

J'ai une url que j'ai besoin d'envoyer une demande à l'aide de variables de date. L'adresse https prend les variables de date. Je voudrais attribuer les dates à la chaîne d'adresse en utilisant quelque chose comme l'opérateur de formatage% en Python. Est-ce que R a un opérateur similaire ou dois-je compter sur paste()?Existe-t-il un opérateur de formatage de chaîne dans R semblable au% de Python?

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

C'est ce que je ferais en Python 2.7:

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

ou en utilisant .format() en 3 +.

La seule que je sais faire en R semble bavard et repose sur la pâte:

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

Y at-il une meilleure façon de le faire?

+0

Peut-être quelque chose comme 'coller (url_start, coller (année, mnth, jour, sep ="/"), url_end)' – CPak

+0

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

Répondre

13

L'équivalent en R est sprintf:

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" 

En outre, même si je pense qu'il est un surpuissant, vous pouvez définir un opérateur vous aussi.

`%--%` <- 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

Peut-être aussi utile de montrer un exemple illustrant la vectorisation comme '" https: .../KBOS /% s /% s /% s/DailyHistory.html "% -% liste (1999: 2000, mnth, jour)" ou l'équivalent sprintf. (Je suppose qu'en python, ils feraient ce genre de chose à la place.) – Frank

5

Comme alternative à sprintf, vous pourriez vouloir vérifier glue.


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

Le paquet stringr a la fonction str_interp():

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

ou à l'aide d'une liste (notez que les valeurs maintenant numériques sont transmises):

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, le formatage des directives peut également être transmis, par exemple, si les champs de mois doit être de deux caractères:

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"