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

beg*_*neR 29 latex r sweave knitr

round() 使用Sweave/knitr时有没有办法避免这个功能?round(,2)每次写作都真烦人\Sexpr{}.我希望在整个文档中有两个小数位.

感谢您的帮助
Macs

Yih*_*Xie 38

如果您已经阅读动机的的knitr,你可能知道我是谁不喜欢的人round()里面\Sexpr{}最.我很久以前为了Sweave向R core建议这个,但它被忽略了,所以我开始自己的包.

虽然约什·奥布莱恩的答案是绝对正确的,我应该说,你真的只需要options(digits = 2)使用knitr,而且也没有必要重新设置默认的内联挂钩,因为默认勾方面此选项.

  • 谢谢你的提示.这真是一个很大的解脱.我是R和LaTeX的初学者,但是相对于Sweave的优势相当明显.我想在很短的时间内,大多数人都会变成针织者. (2认同)

Jos*_*ien 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)
Run Code Online (Sandbox Code Playgroud)


Aar*_*ica 5

首先,您可能希望使用formatC而不是round获得两位数,即使它们为零.在Sweave中没有很好的方法可以做到这一点; 最好的选择可能只是创建一个具有短名称的新功能,以实现您想要的格式化; 就像是

p <- function(x) {formatC(x, format="f", digits=2)}
Run Code Online (Sandbox Code Playgroud)

这至少节省了一点点打字:

The answer is $\Sexpr{p(x)}$.
Run Code Online (Sandbox Code Playgroud)

不幸的是,如果没有与新的Sweave驱动程序混淆,我认为还有其他任何事情要做(也许这是尝试的另一个原因knitr,这似乎正在迅速发展).Sweave在你的Sexpr语句中的内容上执行此操作,然后用Sexpr结果替换调用.

as.character(eval(parse(text = cmd), envir = .GlobalEnv))
Run Code Online (Sandbox Code Playgroud)

但是,你不能只写一个新版本as.character; 除了可能以其他意外方式改变行为的问题之外,由于命名空间,base即使全局环境中存在另一个版本,它也总是调用该版本.