使用修改(改编自Jason French的博客帖子here)到默认的内联knitr
挂钩,我打印数字输出四舍五入到小数点后3位。如果该值小于0.001,则返回"< 0.001"
这是一个显示挂钩修改的MWE,以及我如何在R Markdown中实际使用它:
```{r setup, echo=FALSE}
library(knitr)
inline_hook <- function(x) {
if (is.numeric(x)) {
res <- ifelse(x == round(x),
sprintf("%d", x),
sprintf("%.3f", x)
)
res <- ifelse(x < 0.001, '< 0.001', res)
paste(res, collapse = ", ")
} else paste(as.character(x), collapse = ", ")
}
knit_hooks$set(inline = inline_hook)
```
```{r, echo=FALSE}
stat <- 1.2345
p <- 0.000001
```
Blah was significant (test statistic = `r stat`, p = `r p`)
以上呈现为:
Blah was significant (test statistic = 1.234, p = < 0.001)
请注意p = < 0.001
。优选地,这将是p < 0.001
。是否可以让knitr
检查内联表达式之前是否有等号,如果是,则在适当时禁止它?
如果它有所作为,我实际上编织的是Sweave文档,而不是R Markdown。
答案 0 :(得分:1)
就个人而言,我不喜欢问题/链接博客中使用的inline_hook
。像这样自动转换输出对我来说似乎有风险。目前的问题就是一个例子:有时转换是有害的。
这个问题有一个简单而复杂的解决方案。
可以使用asis_output
:
`r asis_output(0.0001)`
输出1e-04
,即挂钩不适用。否则输出为< 0.001
。
缺点:你要么使用钩子,但是你不知道你是否得到[number]
或< [number]
作为输出(当你想要输出像#34时这是一个问题; p = [数字]&#34; /&#34; p&lt; [number]&#34;)。或者你使用asis_output
;然后你知道没有(in-)相等的符号,但你不能利用钩子。
以下功能适用inline_hook
,但如果挂钩未添加=
,则会添加额外的<
符号:
le <- function(x) {
rel <- if (x >= 0.001) "=" else ""
return(asis_output(paste(rel, inline_hook(x))))
}
这具有以下优点:
请注意,le
未进行矢量化。
<强>示例:强>
```{r setup, echo=FALSE}
library(knitr)
inline_hook <- function(x) {
if (is.numeric(x)) {
res <- ifelse(x == round(x),
sprintf("%d", x),
sprintf("%.3f", x)
)
res <- ifelse(x < 0.001, '< 0.001', res)
paste(res, collapse = ", ")
} else paste(as.character(x), collapse = ", ")
}
knit_hooks$set(inline = inline_hook)
le <- function(x) {
rel <- if (x >= 0.001) "=" else ""
return(asis_output(paste(rel, inline_hook(x))))
}
```
* p `r le(0.01)` (value: 0.01)
* p `r le(0.001)` (value: 0.001)
* p `r le(0.0001)` (value: 0.0001)
* p `r le(0.00001)` (value: 0.00001)
<强>输出:强>
p = 0.010 (value: 0.01)
p = 0.001 (value: 0.001)
p < 0.001 (value: 0.0001)
p < 0.001 (value: 0.00001)