【发布时间】:2018-09-04 00:43:50
【问题描述】:
但在以下情况下,这些似乎无法回答问题:
vec <- c("a","b","c","d")
s<-do.call(sprintf, c(list("%s %s"), vec))
doc 说:“……参数(包括 fmt)如果可能的话会被循环循环到最长的长度,然后并行进行格式化……”
下面的代码表明这没有发生:
> vec <- c("a","b","c","d")
> s<-do.call(sprintf, c(list("%s %s"), vec))
> print(s)
[1] "a b"
> v1 <- c("foo", "bar", "baz","foo", "bar", "baz")
> base_string = "%s, %s, %s"
> s<-do.call(sprintf, c(fmt = base_string, as.list(v1)))
> print(s)
[1] "foo, bar, baz"
>
如何打印出所有的值?
编辑:根据@mt1022,我误读了文档。他建议: sprintf(paste0(v1, collapse = ' ')) 可行。
感谢@chinsoon12 的提示。
我真正想做的是这样的:
> s<-NA
> v<-c(1,"2",pi,2,"foo",2*pi)
> s<-do.call(sprintf, c(v, list(fmt=paste(rep("%d %s %f", length(v)/3), collapse=" "))))
Error in (function (fmt, ...) :
invalid format '%d'; use format %s for character objects
> print(s)
[1] NA
>
答案(感谢@mt1022)是使用列表而不是向量:
v<-list(1,"2",pi,2,"foo",2*pi)
s<-do.call(sprintf, c(v, list(fmt=paste(rep("%d %s %f", length(v)/3), collapse=" "))))
【问题讨论】:
-
你在找
do.call(sprintf, c(vec, list(fmt=paste(rep("%s", length(vec)), collapse=" "))))吗? -
类似的东西。请参阅编辑。
-
你不能在向量中同时保存字符和数字,否则数字将被强制转换为字符。您可以使用
v <- list(1,"2",pi,2,"foo",2*pi)之类的列表保留这些值。那么你的sprintf命令应该可以工作了。 -
像魅力一样工作。
标签: r printf variadic-functions