Latex 控制knitr图形标题中的有效数字
在构造fig.cap时,我很难找到全局控制输出位数的方法。下面是一个例子: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: \
\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()
输出?总有办法。;)请参阅下面的答案以获得建议。