Есть ли оператор форматирования строк в R, похожий на Python%?

У меня есть URL-адрес, который должен отправить запрос на использование переменных даты. Адрес https принимает переменные даты. Я хотел бы назначить даты в адресной строке, используя что-то вроде оператора форматирования% в Python. Имеет ли R аналогичный оператор или мне нужно полагаться на paste()?

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

Это то, что я сделал бы в Python 2.7:

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

Или используя .format() в 3. +.

Единственное, что я знаю, чтобы делать в R, выглядит многословным и полагается на пасту:

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

Есть ли лучший способ сделать это?

Ответ 1

Эквивалент в R равен 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"

Кроме того, хотя я думаю, что это перебор, вы также можете определить оператора.

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

Ответ 2

В качестве альтернативы sprintf вы можете попробовать glue.

Обновление: в stringr 1.2.0 добавлена функция-обертка 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

Ответ 3

Пакет stringr имеет функцию 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"

или используя список (обратите внимание, что теперь передаются числовые значения):

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"

Кстати, директивы форматирования также могут быть переданы, например, если поля месяца должны быть двух символов:

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"

Ответ 4

Самое простое, я думаю, это paste. Пример:

paste("Today is:",  Sys.Date())

дает:

[1] "Today is: 2019-01-23"