有没有可以替代粘贴的功能? 我想知道,如果这样的事情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