Есть ли оператор форматирования строк в 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"