2012-04-26 135 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矢量只能容纳(列表是更灵活的)的一种类型的数据,并将数据插入它们设置的顺序定义。