R 使用钩子在输出中格式化表

R 使用钩子在输出中格式化表,r,markdown,knitr,R,Markdown,Knitr,使用knitr和R Markdown,我可以使用以下命令从矩阵生成表格化输出: ```{r results='asis'} kable(head(x)) ``` 然而,我正在寻找一种方法,使可以隐藏代码,因为我不想用它来干扰回响的代码。基本上,我希望: ```{r table=TRUE} head(x) ``` …以生成格式化的表格(而不是正常的output='markdown')输出 我实际上认为这必须非常简单,因为这是一个非常明显的要求,但我找不到任何方法来实现这一点,无论是通过文档还是

使用knitr和R Markdown,我可以使用以下命令从矩阵生成表格化输出:

```{r results='asis'}
kable(head(x))
```
然而,我正在寻找一种方法,使
可以隐藏
代码,因为我不想用它来干扰回响的代码。基本上,我希望:

```{r table=TRUE}
head(x)
```
…以生成格式化的表格(而不是正常的
output='markdown'
)输出

我实际上认为这必须非常简单,因为这是一个非常明显的要求,但我找不到任何方法来实现这一点,无论是通过文档还是在web上

我创建输出挂钩的方法失败了,因为一旦数据到达挂钩,它就已经格式化,不再是原始数据。即使在指定
results='asis'
时,钩子也会以字符串而不是矩阵的形式获取输出。以下是我尝试过的:

default_output_hook <- knit_hooks$get('output')
knit_hooks$set(output = function (x, options)
    if (! is.null(options$table))
        kable(x)
    else
        default_output_hook(x, options)
)

default\u output\u hook缺少更好的解决方案,我目前正在重新解析我在hook中收到的字符串表示。我把它贴在这里,因为它可以正常工作。然而,解析数据帧的字符串表示永远都不是完美的。除了我自己的数据之外,我没有尝试过以下内容,我完全希望它能突破一些常见的用例

reparse <- function (data, comment, ...) {
    # Remove leading comments
    data <- gsub(sprintf('(^|\n)%s ', comment), '\\1', data)
    # Read into data frame
    read.table(text = data, header = TRUE, ...)
}

default_output_hook <- knit_hooks$get('output')

knit_hooks$set(output = function (x, options)
    if (is.null(options$table))
        default_output_hook(x, options)
    else {
        extra_opts <- if (is.list(options$table)) options$table else list()
        paste(kable(do.call(reparse, c(x, options$comment, extra_opts))),
              collapse = '\n')
    }
)
您可以向
deparse
函数传递额外的参数。这是必要的,例如,当表格包含
NA
值时,因为
read.table
默认将其解释为字符串:

```{r table=list(colClasses=c('numeric', 'numeric'))}
data.frame(A=c(1, 2, NA, 3), B=c(4:6, NA))
```

远非完美,但至少它可以工作(在许多情况下)。

这不完全是您想要的,但我在这里发布了一个答案(这不能放在评论中),因为您描述的工作流与我开始开发我的
pander
软件包时的初始目标和用例非常相似。尽管我非常喜欢
knitr
中提供的一系列块选项,但我希望有一个引擎,使创建文档变得非常简单、自动,并且不需要任何调整。我知道,
knitr
钩子确实很强大,但我只想在我的
Rprofile
中设置一些东西,让识字编程工具不再麻烦地完成它的工作,这对我来说是个问题


主要思想是指定几个选项(您使用的是什么标记风格、小数点是什么、图表最喜欢的颜色等),然后只需使用brew语法编写报告,而不使用任何块选项,代码的结果将自动转换为标记。然后用Pandoc将其转换为pdf/docx/odt等。

我认为其他答案来自以下不起作用的时期,但现在我们可以这样做:

```{r results='asis', render=pander::pander}
head(x)
```
或者为设置块中的所有块设置此选项,例如:

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, render=pander::pander)
```

现在可以在YAML标题中设置
df_print

---
output:
  html_document:
    df_print: kable  
---

```{r}
head(iris)
```

这对于宽矩阵是失败的,因为它们的行被分成多行。唉,这太粗俗了。希望在12月会有一种更自然的方式。“我现在正忙着其他事情呢!”一慧:好消息,谢谢。“这是黑客行为”——只要你读到“重新解析”,你就会明白这一点对我的目标是在重新解析时删除前缀“re:)这已经晚了,但可能会有所帮助。我通过将
evaluate()
应用于
knit\u hooks$set()
源代码,然后应用于Kable代码来解决这个问题。它已经计划了很长一段时间,我知道如何做,但仍然没有找到时间:最终我将允许用户定义自己的打印功能。
---
output:
  html_document:
    df_print: kable  
---

```{r}
head(iris)
```