如何在 r 中打印可变数量的参数?
how to print a variable number of arguments in r?
r 的新手。这个问题有答案 here and .
但这些似乎无法回答以下情况的问题:
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(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
要打印三个变量,但你提供了六个。
那么文档中的"recycled"是什么意思呢?
我想你可能会误解它。这意味着当格式化字符串和向量的长度不同时,较短的将被回收到最长的。一个例子:
> 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"
r 的新手。这个问题有答案 here and
但这些似乎无法回答以下情况的问题:
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(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
要打印三个变量,但你提供了六个。
那么文档中的"recycled"是什么意思呢?
我想你可能会误解它。这意味着当格式化字符串和向量的长度不同时,较短的将被回收到最长的。一个例子:
> 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"