以文本上下文为条件格式化内联输出

时间:2016-02-27 04:18:18

标签: r formatting knitr sweave

使用修改(改编自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。

1 个答案:

答案 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))))
}

这具有以下优点:

  1. 可以使用挂钩。
  2. 总有一个(in-)等号。
  3. 请注意,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)