10

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

```{r results='asis'}
kable(head(x))
```

但是,我正在寻找一种使kable代码隐含的方法,因为我不想将回显的代码与它混淆。本质上,我想要这个:

```{r table=TRUE}
head(x)
```

…产生一个格式化的表格(而不是正常的output='markdown')输出。

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

我创建输出挂钩的方法失败了,因为一旦数据到达挂钩,它就已经格式化,不再是原始数据。即使指定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)
)

但就像我说的,这失败了,因为x不是原始矩阵而是字符串,results我指定的选项的值并不重要。

4

4 回答 4

3

现在可以df_print在 YAML 标头中设置:

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

```{r}
head(iris)
```
于 2019-09-12T15:17:34.913 回答
2

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

```{r results='asis', render=pander::pander}
head(x)
```

或者为设置块中的所有块设置这个,例如:

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, render=pander::pander)
```
于 2019-09-12T15:09:04.550 回答
1

不完全是您正在寻找的内容,但我在这里发布了一个答案(无法放入评论),因为您描述的工作流程与我开始处理我的pander包时的初始目标和用例非常相似。尽管我真的很喜欢 中提供的大量块选项,但knitr我希望拥有一个引擎,使创建文档变得非常容易、自动且无需任何调整。我知道knitr钩子真的很强大,但我只是想在我的中设置一些东西,Rprofile让文学编程工具顺利工作,而这最终Pandoc.brew适合我。

主要思想是指定一些选项(你使用什么降价风格,你的小数点是什么,你的图表最喜欢的颜色等),然后简单地用没有任何块选项的 brew 语法编写你的报告,以及你的代码的结果将自动转换为 markdown。然后使用 Pandoc 将其转换为 pdf/docx/odt 等。

于 2013-11-09T20:52:00.570 回答
1

缺乏更好的解决方案我目前正在重新解析我在钩子中收到的字符串表示。我把它贴在这里,因为它有点工作。但是,解析数据框的字符串表示形式从来都不是完美的。除了我自己的数据之外,我没有尝试过以下任何事情,我完全希望它能够在一些常见的用例上有所突破。

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')
    }
)

如果将 R markdown选项设置为包含正则表达式特殊字符(例如 )的字符序列,这中断,因为 R 似乎没有明显的方法来转义正则表达式。comment*

这是一个使用示例:

```{r table=TRUE}
data.frame(A=1:3, B=4:6)
```

您可以将额外的参数传递给deparse函数。这是必要的,例如当表包含NA值时,因为read.table默认情况下将它们解释为字符串:

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

远非完美,但至少它有效(在许多情况下)。

于 2013-11-09T17:42:15.543 回答