有沒有可以替代粘貼的功能? 我想知道,如果這樣的事情R中存在:粘貼的替代功能
> buildString ("Hi {1}, Have a very nice {2} ! " , c("Tom", "day"))
有沒有可以替代粘貼的功能? 我想知道,如果這樣的事情R中存在:粘貼的替代功能
> buildString ("Hi {1}, Have a very nice {2} ! " , c("Tom", "day"))
frankc和迪文是你的權利指向sprintf()
。
如果由於某種原因你更換零件真的會是載體的形式(即c("Tom", "day")
),你可以使用do.call()
通過他們到sprintf()
:
string <- "Hi %s, Have a really nice %s!"
vals <- c("Tom", "day")
do.call(sprintf, as.list(c(string, vals)))
# [1] "Hi Tom, Have a really nice day!"
我認爲你正在尋找的sprintf。
具體做法是:
sprintf("Hi %s, Have a very nice %s!","Tom","day")
的sprintf
函數是一個方法,因爲其他人所說的,這裏是一個使用gsubfn
包裝的另一個方法:
> library(gsubfn)
> who <- "Tom"
> time <- "day"
> fn$paste("Hi $who, have a nice $time")
[1] "Hi Tom, have a nice day"
非常好,謝謝! – flodel 2012-04-27 01:48:47
爲fn $粘貼工作,變量必須是全局變量在這裏,有沒有辦法使用fn $粘貼本地變量myfunction < - function(X){fn $ paste(「Hello $ X」)} ..我真的需要這樣的:-) – MadSeb 2012-05-04 17:23:33
如果你使用的是函數的參數,那麼似乎sprintf函數會起作用。如果你希望用戶能夠提供字符串,但你的函數有一組他們可以使用的特定變量,那麼你可以對gsub(或gsubfn)進行一系列的調用來替換可能的$ who或者$時間。這是blockrand軟件包使用的方法(plot.block和function)。 – 2012-05-05 19:03:42
的whisker
包做到這一點非常好,值得更多的appreciatio N:
require(whisker)
whisker.render ("Hi {{name}}, Have a very nice {{noun}} ! " , list(name="Tom", noun="day"))
+1,功能很好。我認爲列表中的順序並不重要?在包中使用它的一個缺點是它會引入對whisker包的依賴。 – 2012-05-04 08:32:32
如果您真的擔心依賴關係,您可以編輯(gsubfn)並將其保存爲新函數。如果你已經在使用stringr,你可以嘗試這個函數(http://blog.aboutwilson.net/posts/2014-04/string-interpolation-in-r/),它的目的與你的意圖精確匹配。 – ideamotor 2015-02-02 16:55:37
隨着1.1.0版本(於2016年8月19日發佈CRAN),該stringr
包已經獲得了字符串插值功能str_interp()
。
隨着str_interp()
以下使用情況是可能的:
環境
v1 <- "Tom"
v2 <- "day"
stringr::str_interp("Hi ${v1}, Have a very nice ${v2} !")
#[1] "Hi Tom, Have a very nice day !"
在名爲列表中提供的參數
stringr::str_interp(
"Hi ${v1}, Have a very nice ${v2} !",
list("v1" = "Tom", "v2" = "day"))
#[1] "Hi Tom, Have a very nice day !"
變量變量定義的變量在載體中
values <- c("Tom", "day")
stringr::str_interp(
"Hi ${v1}, Have a very nice ${v2} !",
setNames(as.list(values), paste0("v", seq_along(values)))
)
#[1] "Hi Tom, Have a very nice day !"
注意,value
矢量只能容納(列表是更靈活的)的一種類型的數據,並將數據插入它們設置的順序定義。
明確地說'sprintf(「Hi%s,有一個很好的%s!」,「Tom」,「day」)'(填入* vector *的值會有點棘手) – 2012-04-26 20:44:33
值得'sprintf'在*參見*部分'?paste'(!!) – 2012-04-26 20:45:33
閱讀幫助文件是作弊! – 2012-04-26 20:50:31