30

round() 使用 Sweave/knitr 时有没有办法避免该功能?round(,2)每次都写真的很烦\Sexpr{}。我想在整个文档中保留两位小数。

感谢您的
帮助

4

3 回答 3

40

如果你看过包装的动机,你可能知道我是里面最讨厌的人。我很久以前就向 R core 建议过 Sweave,但它被忽略了,所以我开始了自己的包。knitrround()\Sexpr{}

虽然 Josh O'Brien 的回答是绝对正确的,但我应该说你真的只需要options(digits = 2)with knitr,并且不需要重置默认的内联钩子,因为默认的钩子尊重这个选项。

于 2012-06-17T15:47:38.913 回答
15

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)
于 2012-06-16T16:17:08.127 回答
6

首先,您可能想要使用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即使全局环境中有另一个版本,它也总是调用该版本。

于 2012-06-16T19:23:16.877 回答