Как вывести переменное количество аргументов в г? - PullRequest
0 голосов
/ 04 сентября 2018

новичок в р. на этот вопрос есть ответы здесь и здесь .

Но они, кажется, не отвечают на вопрос в случае:

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

1 Ответ

0 голосов
/ 04 сентября 2018

Док прав. В первом случае 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"
...