2012-04-26 142 views
19

有沒有可以替代粘貼的功能? 我想知道,如果這樣的事情R中存在:粘貼的替代功能

> buildString ("Hi {1}, Have a very nice {2} ! " , c("Tom", "day")) 

回答

25

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!" 
17

我認爲你正在尋找的sprintf。

具體做法是:

sprintf("Hi %s, Have a very nice %s!","Tom","day") 
+4

明確地說'sprintf(「Hi%s,有一個很好的%s!」,「Tom」,「day」)'(填入* vector *的值會有點棘手) – 2012-04-26 20:44:33

+3

值得'sprintf'在*參見*部分'?paste'(!!) – 2012-04-26 20:45:33

+7

閱讀幫助文件是作弊! – 2012-04-26 20:50:31

21

sprintf函數是一個方法,因爲其他人所說的,這裏是一個使用gsubfn包裝的另一個方法:

> library(gsubfn) 
> who <- "Tom" 
> time <- "day" 
> fn$paste("Hi $who, have a nice $time") 
[1] "Hi Tom, have a nice day" 
+0

非常好,謝謝! – flodel 2012-04-27 01:48:47

+0

爲fn $粘貼工作,變量必須是全局變量在這裏,有沒有辦法使用fn $粘貼本地變量myfunction < - function(X){fn $ paste(「Hello $ X」)} ..我真的需要這樣的:-) – MadSeb 2012-05-04 17:23:33

+0

如果你使用的是函數的參數,那麼似乎sprintf函數會起作用。如果你希望用戶能夠提供字符串,但你的函數有一組他們可以使用的特定變量,那麼你可以對gsub(或gsubfn)進行一系列的調用來替換可能的$ who或者$時間。這是blockrand軟件包使用的方法(plot.block和function)。 – 2012-05-05 19:03:42

17

whisker包做到這一點非常好,值得更多的appreciatio N:

require(whisker) 
whisker.render ("Hi {{name}}, Have a very nice {{noun}} ! " , list(name="Tom", noun="day")) 
+0

+1,功能很好。我認爲列表中的順序並不重要?在包中使用它的一個缺點是它會引入對whisker包的依賴。 – 2012-05-04 08:32:32

+0

如果您真的擔心依賴關係,您可以編輯(gsubfn)並將其保存爲新函數。如果你已經在使用stringr,你可以嘗試這個函數(http://blog.aboutwilson.net/posts/2014-04/string-interpolation-in-r/),它的目的與你的意圖精確匹配。 – ideamotor 2015-02-02 16:55:37

1

隨着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矢量只能容納(列表是更靈活的)的一種類型的數據,並將數據插入它們設置的順序定義。