R 中是不是有类似于 Python 的 % 的字符串格式化运算符?

Posted

技术标签:

【中文标题】R 中是不是有类似于 Python 的 % 的字符串格式化运算符?【英文标题】:Is there a string formatting operator in R similar to Python's %?R 中是否有类似于 Python 的 % 的字符串格式化运算符? 【发布时间】:2018-02-15 12:55:05 【问题描述】:

我有一个 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)

或者在 3.+ 中使用 .format()。

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

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

有更好的方法吗?

【问题讨论】:

可能类似于paste(url_start, paste(year,mnth,day,sep="/"), url_end) 见***.com/questions/17475803/… 【参考方案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"

【讨论】:

也许还值得展示一个示例来说明矢量化,例如 "https:.../KBOS/%s/%s/%s/DailyHistory.html" %--% list(1999:2000, mnth, day) 或 sprintf 等价物。 (我猜在 python 中他们会循环这种东西。) 当您的文本中有其他百分比字符时会变得很棘手......例如带有通配符运算符的 SQL 查询。【参考方案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"

【讨论】:

这是最接近python中灵活的format的。看起来很不错。

以上是关于R 中是不是有类似于 Python 的 % 的字符串格式化运算符?的主要内容,如果未能解决你的问题,请参考以下文章

Python 等价于 Java StringBuffer?

swift中的任何功能是不是类似于Android中的R.java?

类似于 R 的 Python 线性回归诊断图

Python中是不是有类似于C++ STL map的结构?

Python中是不是有类似于Perl中的“想要”的东西

python中是不是有类似于osgi试图在java中解决的要求?