round()
使用 Sweave/knitr 时有没有办法避免该功能?round(,2)
每次都写真的很烦\Sexpr{}
。我想在整个文档中保留两位小数。
感谢您的
帮助
在knitr
中,内联钩子可用于处理\Sexpr{}
语句的输出。因此,如果您只想打印内联代码的小数点后 2 位数字(同时不考虑整体digits
选项),您可以这样做:
## First have a look at the default inline hook function
knit_hooks$get("inline")
## Then customize it to your own liking
inline_hook <- function(x) {
if(is.numeric(x)) x <- round(x, 2)
paste(as.character(x), collapse=", ")
}
knit_hooks$set(inline = inline_hook)
首先,您可能想要使用formatC
而不是round
获得两位数,即使它们为零。在 Sweave 中没有很好的方法来做到这一点。最好的选择可能是简单地创建一个具有短名称的新函数来执行您想要的格式;就像是
p <- function(x) {formatC(x, format="f", digits=2)}
这至少节省了一点打字:
The answer is $\Sexpr{p(x)}$.
不幸的是,如果不使用新的 Sweave 驱动程序,我认为没有其他事情可做(也许这是另一个尝试的理由knitr
,这似乎正在快速取得进展)。Sweave 对Sexpr
语句中的内容执行此操作,然后将Sexpr
调用替换为结果。
as.character(eval(parse(text = cmd), envir = .GlobalEnv))
但是,你不能只写一个新版本的as.character
; 除了可能以其他意想不到的方式改变行为的问题之外,由于命名空间,base
即使全局环境中有另一个版本,它也总是调用该版本。