代码之家  ›  专栏  ›  技术社区  ›  moodymudskipper

在降价报告中列出所有表

  •  0
  • moodymudskipper  · 技术社区  · 6 年前

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

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

    kable 代码是隐式的,因为我不想用它来搅乱回显的代码。基本上,我想要这个:

    ```{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)
    )
    

    但就像我说的,这失败了 x 不是原始矩阵,而是字符串,而与 results

    0 回复  |  直到 12 年前
        1
  •  2
  •   moodymudskipper    6 年前

    我想其他的答案都是从以下几点都不起作用的时候开始的,但现在我们可以这样做了:

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

    或者为设置块中的所有块设置此选项,例如:

    ```{r setup, include=FALSE}
    knitr::opts_chunk$set(echo = TRUE, render=pander::pander)
    ```
    
        2
  •  3
  •   Ralf Stubner    6 年前

    现在人们可以设定 df_print 在YAML头中:

    ---
    output:
      html_document:
        df_print: kable  
    ---
    
    ```{r}
    head(iris)
    ```
    
        3
  •  1
  •   Konrad Rudolph    12 年前

    由于缺乏更好的解决方案,我目前正在重新解析钩子中接收到的字符串表示。我把它贴在这里是因为它很管用。然而,解析数据帧字符串表示从来都不是完美的。除了我自己的数据之外,我没有尝试过下面的任何东西,我完全希望它能打破一些常见的用例。

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

    这个 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))
    ```
    

    远不是完美的,但至少(在很多情况下)是有效的。

        4
  •  1
  •   daroczig    12 年前

    不完全是你要找的,但是我在这里发布了一个答案(不能放在评论中),因为你所描述的工作流与我开始研究 pander 包裹。尽管我真的很喜欢 knitr ,我想有一个引擎,使创建文档非常容易,自动和没有任何必要的调整。我知道事实上 钩子真的很有力,但我只想在我的 Rprofile 让有文化的编程工具不费吹灰之力 Pandoc.brew 为了我。

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