【问题标题】:Concatenate text with knitr用 knitr 连接文本
【发布时间】:2013-09-04 07:24:14
【问题描述】:

使用knitr,我想打印一些变量的几个函数的结果,例如

There were x1 (a=\`r a(x1)\`; b=\`r b(x1)\`) and x2 (a=\`r a(x2)\`; b=\`r b(x2)\`)

因为我不喜欢对每个变量都重复这个,所以我写了一个函数来生成字符串:

foo <- function(x) paste('a = ',a(x), '; b = ', b(x))

现在我可以写There were x1 (`r foo(x1)`) and x2 (`r foo(x2)`)

它可以工作,但不使用options('digits'),所以它打印15位数字。 cat() 使用 options('digits'),但显然是 using cat is discouraged 并且在使用内联代码时不输出任何内容。

是否有替代 paste() 的替代方法,它使用 `options('digits') 格式化数字并在内联块中创建输出?

【问题讨论】:

    标签: r knitr


    【解决方案1】:

    “不鼓励使用 cat”:这是一种误解。 Yihui 警告不要使用cat 输出消息。如果要创建干净的输出,通常必须使用 cat。在您的块中尝试以下操作:

    options(digits=2)
    x1 = 2.304302
    # chunk output
    x1 # Ugly, [1]
    cat(x1,"\n") # Must use cat here, to avoid the [1] printed
    

    您的主要问题是:如果没有在您的 foo 函数中明确格式化,这里就没有机会,最好使用 sprintfOptions 仅适用于内联数字代码,不适用于函数 foo 提供的字符串。 knitr不干扰paste的功能,粘贴不尊重options

    x2 = 4.489324802    
    options(digits=2)
    paste(x2)
    

    “4.489324802”

    【讨论】:

    • 很高兴听到我可以使用 cat 而不会感到内疚。但是, cat 在内联代码中使用时不会打印任何内容,例如Example: `r cat(2.50,' ; ',3.131,' ; ',4.987)`
    • 是的,那一点是正确的(并且在某处有记录)。 cat 适用于块内代码。
    • @tstenner cat() 返回NULL,所以你什么也得不到。我认为您必须在此处使用一种显式格式化函数,例如format[C]()sprintf()round(),例如sprintf('%.02f', x)round(x, getOption('digits'))
    【解决方案2】:

    format(x, ...) 可能会为此工作。 (未测试)

    【讨论】:

    • 它应该可以工作,但它只接受一个参数,所以我必须写类似paste('a = ',format(a(x),...),...)
    • 这就是 sprintf 更好的地方,即使语法对于非 C 爱好者来说有点奇怪
    猜你喜欢
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多