Latex 控制knitr图形标题中的有效数字

Latex 控制knitr图形标题中的有效数字,latex,knitr,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: \

在构造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}
\documentclass{article}
\开始{document}
=
选项(数字=3)
@
=
绘图(pi)
@
这是pi:\Sexpr{pi}
\结束{document}

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

=

但是,有没有一种方法可以全局设置所有区块的值?

要稍微重复一下问题(因为观察到的行为与区块选项与
\Sexpr
无关),我们可以这样说:

为什么
打印(pi)
尊重
选项(数字=3)
打印(粘贴(“pi的值是”,pi))
不尊重?我能做些什么呢

原因是
getOption(“digits”)
仅在打印数字值时适用(参见
?options
)。因此,当一个数值被强制为
字符
,然后像第二种情况那样使用
打印(粘贴(…
)打印时,将不会进行舍入

在回答了为什么会发生这种情况之后,让我们转到“我能做些什么?”部分

一个非常简单的解决方案是使用
sprintf
。实际上,在许多情况下这是一个好主意,因为代码非常容易阅读。在这里,我们还可以通过使用
%f
从格式选项中获益:

> print(sprintf("The value of pi is %.4f", pi))
[1] "The value of pi is 3.1416"
另一种方法是坚持
打印(粘贴(…
结构,但不需要手动舍入。一个优点是使用
getOption(“数字”)
(与
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))
}

为了稍微重新思考一下这个问题(因为观察到的行为与chunk options vs.
\Sexpr
)无关),我们假设:

为什么
print(pi)
尊重
选项(数字=3)
print(粘贴(“pi的值是”,pi))
不尊重?我能做些什么

原因是
getOption(“digits”)
仅在打印数字值时适用(参见
?options
)。因此,当数字值强制为
字符
,然后像第二种情况一样打印时(粘贴(…)

在回答了为什么会发生这种情况之后,让我们转到“我能做些什么?”部分

一个非常简单的解决方案是使用
sprintf
。实际上,在许多情况下这是一个好主意,因为代码非常容易阅读。在这里,我们还可以通过使用
%f
从格式选项中获益:

> print(sprintf("The value of pi is %.4f", pi))
[1] "The value of pi is 3.1416"
另一种方法是坚持
打印(粘贴(…
结构,但不需要手动舍入。一个优点是使用
getOption(“数字”)
(与
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))
}

knitr
通常尊重
选项(“数字”)
。您观察到的行为是因为只有在打印数值变量时才会应用自动舍入。通过使用
paste
创建字符串(将字符串和在您的情况下转换为字符串的浮点连接起来)在那之后,
knitr
再也不能对舍入做任何事情了。我认为这种行为是正确的。你需要区分“打印数字”和“处理数字,将它们转换为字符串”。后一种情况下没有舍入。我明白了,谢谢。我想没有办法将
修改为.character()
通过全局选项输出?总有一种方法。;(请参阅下面的答案以获取建议。
knitr
通常尊重
选项(“数字”)
。您观察到的行为是因为自动舍入仅适用于打印数字变量。通过使用
粘贴
创建字符串(在您的案例中,连接字符串和转换为字符串的浮点)之后,
knitr
无法再对舍入进行任何处理。我认为这种行为是正确的。您需要区分“打印数字”和“处理数字,将其转换为字符串”。在后一种情况下没有舍入。我明白了,谢谢。我想没有办法通过全局选项修改
as.character()
输出?总有办法。;)请参阅下面的答案以获得建议。