簡體   English   中英

如何在r中打印可變數量的參數?

[英]how to print a variable number of arguments in r?

R的新手。 這個問題在這里這里都有答案。

但是在以下情況下,這些似乎無法回答問題:

vec <- c("a","b","c","d")
s<-do.call(sprintf, c(list("%s %s"), vec))

文檔說:“ ...如果可能,將參數(包括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,crash =''))有效。

感謝@ 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(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打印三個變量,但您提供了六個。


那么,文檔中的“回收”是什么意思?

我想您可能會誤解它。 這意味着當格式化字符串和向量的長度不同時,較短的格式化字符串和向量將被回收到最長的一個。 一個例子:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM