web-dev-qa-db-fra.com

Existe-t-il un opérateur de formatage de chaînes dans R similaire au% de Python?

J'ai une URL dont j'ai besoin pour 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 me fier à paste ()?

# 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 () dans 3. +.

La seule chose que je saurais faire dans R semble verbeuse et repose sur la pâte:

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

Existe-t-il une meilleure façon de le faire?

20
Conner M.

L'équivalent dans 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"

De plus, même si je pense que c'est une exagération, vous pouvez également définir vous-même un opérateur.

`%--%` <- 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"
30
LyzandeR

Comme alternative à sprintf, vous voudrez peut-être vérifier glue .

Mise à jour: Dans stringr 1.2.0, ils ont ajouté une fonction wrapper de glue::glue(), - str_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
21
austensen

Le package 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 en utilisant une liste (notez que maintenant des valeurs numériques sont passées):

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, les directives de formatage peuvent également être transmises, par exemple, si les champs du mois doivent avoir deux caractères de large:

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"
6
Uwe