控制knitr figure字幕中的有效数字

时间:2015-09-07 18:24:47

标签: latex knitr

我在构建fig.cap时无法找到全局控制输出位数的方法。这是一个例子:

\documentclass{article}
\begin{document}

<<first_chunk, echo = FALSE>>=
options(digits = 3)
@

<<second_chunk, fig.cap = paste("Pi equals",  pi), echo = FALSE>>=
plot(pi)
@

This is pi: \Sexpr{pi}
\end{document}

enter image description here

我可以使用round()手动为每个块设置它:

<<second_chunk, fig.cap = paste("Pi equals",  round(pi, 3)), echo = FALSE>>=

但有没有办法为所有块设置全局?

1 个答案:

答案 0 :(得分:0)

要重新整理一下这个问题(因为观察到的行为与块选项与\Sexpr无关),让我们说:

  

为什么print(pi)尊重options(digits = 3)print(paste("The value of pi is", pi))不尊重?我能做些什么呢?

原因是getOption("digits")仅在打印数字值时适用(参见?options)。因此,当数字值被强制转换为character,然后按照print(paste(…的第二种情况打印时,将不会进行舍入。

回答为什么会发生这种情况后,让我们转向“我能做些什么呢?”一部分。

一个非常简单的解决方案是使用sprintf。实际上,在许多情况下这是一个好主意,因为代码很容易阅读。在这里,我们还可以使用%f

从格式选项中受益
> print(sprintf("The value of pi is %.4f", pi))
[1] "The value of pi is 3.1416"

另一种方法是坚持print(paste(…结构,但不需要手动舍入。一个优点是可以使用getOption("digits")(而不是sprintf方法)。

为此,请按以下方式定义paste2

paste2 <- function(..., sep = " ", collapse = NULL, digits = getOption("digits")) {

  arguments <- list(...)

  for (i in seq_along(arguments)) {
    if (is.numeric(arguments[[i]])) {
      arguments[[i]] <- round(arguments[[i]], digits = digits)
    }
  }

  if (!missing(sep)) {
    arguments$sep <- sep
  }

  if (!missing(collapse)) {
    arguments$collapse <- collapse
  }

  return(do.call(what = paste, args = arguments))
}

谨慎使用paste2我尽量避免与paste之间存在多少不必要的差异,但仍可能存在“意外功能”。

paste2可用于组合数字和字符变量,默认情况下将前者四舍五入为getOption("digits")位数:

> options(digits = 3)
> print(paste2("The value of pi is", pi))
[1] "The value of pi is 3.142"

> options(digits = 1)
> print(paste2("The value of pi is", pi))
[1] "The value of pi is 3.1"