如何在r中打印可变数量的参数?

问题描述 投票:0回答:1

新的r。这个问题有答案herehere

但在以下情况下,这些似乎没有回答这个问题:

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,我误读了doc。他建议: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=" "))))
r printf variadic-functions
1个回答
1
投票

文件是对的。在第一种情况下,do.call(sprintf, c(list("%s %s"), vec))等于:

sprintf("%s %s", "a","b","c","d")

fmt字符串"%s %s"需要两个向量,而您提供了四个,最后两个(“c”,“d”)不用于打印。

第二种情况类似。 do.call(sprintf, c(fmt = base_string, as.list(v1)))等于:

sprintf(fmt = "%s, %s, %s", "foo", "bar", "baz","foo", "bar", "baz")

根据fmt打印三个变量但是你提供了六个变量。


然后,doc中的“再循环”是什么意思?

我想你可能会误解它。这意味着当格式化字符串和向量具有不同的长度时,较短的字符串将被循环到最长的字符串。一个例子:

> sprintf(c('%s %s', '%s, %s'), c('a', 'b', 'c'), 1:6)
[1] "a 1"  "b, 2" "c 3"  "a, 4" "b 5"  "c, 6"

如何打印可变数量的参数:您可以尝试paste

> sprintf(paste0(vec, collapse = ' '))
[1] "a b c d"
> sprintf(paste0(v1, collapse = ', '))
[1] "foo, bar, baz, foo, bar, baz"
© www.soinside.com 2019 - 2024. All rights reserved.