web-dev-qa-db-ja.com

Pythonの%に似たRの文字列フォーマット演算子はありますか?

日付変数を使用してリクエストを送信する必要がある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) 

これを行うより良い方法はありますか?

20
Conner M.

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

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
21
austensen

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"

ところで、たとえば、月のフィールドの幅を2文字にする必要がある場合は、フォーマットディレクティブも渡すことができます。

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