代码之家  ›  专栏  ›  技术社区  ›  Ray Tayek

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

  •  0
  • Ray Tayek  · 技术社区  · 6 年前

    here here .

    但这些似乎不能回答以下问题:

    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='')可以工作。

    我真正想做的是:

    > 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 回复  |  直到 6 年前
        1
  •  1
  •   mt1022    6 年前

    医生是对的。在第一种情况下, 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"