如何避免在每个\ Sexpr {}中使用round()?

时间:2012-06-16 10:03:59

标签: r latex sweave knitr

使用Sweave / knitr时有没有办法避免使用round()函数?在每个round(,2)中编写\Sexpr{}真的很烦人。我希望整篇文档中有两位小数。

感谢您的帮助 Macs

3 个答案:

答案 0 :(得分:36)

如果您已阅读the motivationknitr package,那么您可能知道我是最讨厌round()\Sexpr{}的人。我很久以前为了Sweave向R core建议这个,但它被忽略了,所以我开始自己的包。

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

答案 1 :(得分:13)

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)

答案 2 :(得分:5)

首先,您可能希望使用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中的版本,即使在全局环境中有另一个版本。