новичок в р. на этот вопрос есть ответы здесь и здесь .
Но они, кажется, не отвечают на вопрос в случае:
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=" "))))