我在构建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}
我可以使用round()手动为每个块设置它:
<<second_chunk, fig.cap = paste("Pi equals", round(pi, 3)), echo = FALSE>>=
但有没有办法为所有块设置全局?
答案 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"