R中的字符串格式化运算符是否类似于Python' s%?

时间:2017-09-06 22:35:50

标签: python r string format

我有一个网址,我需要发送使用日期变量的请求。 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)

或在3。+。

中使用.format()

我唯一知道在R中做的事情似乎很冗长并且依赖于粘贴:

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

有更好的方法吗?

3 个答案:

答案 0 :(得分:28)

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"

答案 1 :(得分:18)

作为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

答案 2 :(得分:6)

list.contains()包具有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))