在使用knitr生成pandoc转换为PDF的过程中,如何在R markdown文件中使用表格标题?

14

我想知道是否可以在.Rmd文件中使用knitr来像处理图标题一样处理表格标题?

我看到了处理图标题的选项,但是没有找到处理表格标题的选项。我也想要去掉像"% latex table generated in R 2.15.2 by xtable 1.7-0 package % Wed Mar 06 15:02:11 2013"这样的信息。

我使用xtable创建了该表:我使用的示例代码如下:

```{r table2, results='asis', message=FALSE} 
library(xtable) 
print(xtable(head(iris))) 
``` 

我得到的经过 pandoc 处理后的表格如下所示:

enter image description here

我尝试在Rmd文件中使用message=FALSE来消除上面显示的消息。 我还想知道是否可能在Rmd中自动添加表格标题?
所谓标题是指下面的内容(这是针对图表的),图表编号会自动更新。
此输出是通过使用knitr创建的markdown文件生成pdf时的快照。

enter image description here

谢谢。


我认为你所寻找的答案大部分可以通过使用?xtable?print.xtable来实现。请查看typecaption - Tyler Rinker
对于LaTeX注释,问题已在xtable中得到解决;请参见https://github.com/yihui/knitr-book/issues/3(新版本的`xtable`现在已经在CRAN上发布)。 - Yihui Xie
@ Yihui:我从CRAN升级了我的xtable,现在我有最新版本,但输出仍然相同。我使用了以下代码<pre>{r table2, results='asis', message=FALSE,echo=FALSE} library(xtable) print(xtable(head(iris))) </pre>。我做错了什么吗? - Jd Baba
1
@Jdbaba请阅读文档?print.xtable并查看comment参数。 - Yihui Xie
@Jdbaba。我猜你现在已经解决了xtable显示“%latex table generated in R 2.15.2 by xtable”的问题。即使查看print.xtable,我也找不到解决方法。 - Maximilian
1
所以,这是解决方案:print(xtable(yourtable, comment = getOption("xtable.comment", FALSE))) - Maximilian
4个回答

12
如果您不坚持使用仅基于LaTeX/HTML的解决方案,而是使用Pandoc的markdown,则可以实现相同的效果。一种选择是在表格下方手动添加caption manually,或者使用我的R Pandoc writer package
> library(pander)                         # load pkg
> panderOptions('table.split.table', Inf) # not to split table
> set.caption('Hello Fisher!')            # add caption
> pander(head(iris))                      # show (almost) any R object in markdown
-------------------------------------------------------------------
 Sepal.Length   Sepal.Width   Petal.Length   Petal.Width   Species 
-------------- ------------- -------------- ------------- ---------
     5.1            3.5           1.4            0.2       setosa  

     4.9            3.0           1.4            0.2       setosa  

     4.7            3.2           1.3            0.2       setosa  

     4.6            3.1           1.5            0.2       setosa  

     5.0            3.6           1.4            0.2       setosa  

     5.4            3.9           1.7            0.4       setosa  
-------------------------------------------------------------------

Table: Hello Fisher!

然后使用Pandoc将这个Markdown文件转换为HTML、LaTeX、docx、odt或其他流行的文档格式。

我正在尝试使用您很好的pander包,但找不到控制表格标题 位置 的选项(默认情况下,位置在表格下方,但我需要在上方)。我查阅了文档和网络,但没有找到。有什么建议吗?(我知道我可以独立地生成R Markdown文本作为标题,但是这样就存在标题和表格之间的边距问题。能够同时指定位置(上方/下方)和边距将是很好的。) - Aleksandr Blekh
1
@AleksandrBlekh 在表格上方添加标题不是有效的 Markdown 语法,应该放在表格下方。另一方面,您可以在 HTML 或 LaTeX 中将其呈现在表格/图像上方。对于前者,请使用 JavaScript;对于后者,我建议使用 captionfloatrow LaTeX 包,例如 \floatsetup[table]{capposition=top} - daroczig
1
@AleksandrBlekh 这个修复听起来很不错,但对我来说似乎只适用于LaTeX。RStudio已经发布了一些二进制文件:https://s3.amazonaws.com/rstudio-buildtools/pandoc-1.13.1.zip 无论如何,您仍然可以使用多种输出格式和“表格/图像上方的标题”的Markdown,但这样您必须为HTML、PDF等开发自定义模板。这是一次性的投资,您可以将其用于所有未来的报告,因此除了上述单行LaTeX调用外,您还需要在自定义HTML模板中添加另一个单行JavaScript调用来将标题移动到对象上方。 - daroczig
1
@AleksandrBlekh,您上面链接的更新日志在“LaTeX writer”部分下面有引用部分,因此我认为这个更新与其他输出格式无关。此外,我认为标题的Markdown规范(将其放在表格下方)也没有改变。关于“模板”:可能我应该写“样式表”,例如在http://johnmacfarlane.net/pandoc/README.html#general-writer-options中看到的`--template`和`-H`。简而言之:您可以覆盖Pandoc创建文档的捆绑设计。 - daroczig
感谢澄清。将会查看这些信息。 - Aleksandr Blekh
显示剩余3条评论

10

您可以使用直接knitr代码在Markdown中插入带有自动编号标题的表格,以便使用pandoc进行处理。将以下代码片段插入到您的.rmd文件顶部:

```{r setup, echo=FALSE}
tn = local({
  i = 0
  function(x) {
    i <<- i + 1
    paste('\n\n:Table ', i, ': ', x, sep = '')
    # The : before Table tells pandoc to wrap your caption in <caption></caption>
  }
})
knit_hooks$set(tab.cap = function(before, options, envir) {
  if(!before)
    tn(options$tab.cap)
})
default_output_hook = knit_hooks$get("output")
knit_hooks$set(output = function(x, options) {
  if (is.null(options$tab.cap) == F)  
    x
  else
    default_output_hook(x,options)
})
```

插入带编号的表格标题:
```{r myirischunk, tab.cap="This is the head of the Iris table"}
kable(head(iris))
```

通过覆盖输出钩子并使用tab.cap,您无需在chunk选项中添加results ='asis'即可轻松输出结果。

感谢Knitr!

附注:如果要转换为latex / pdf,则可能希望latex为您编号表格。在这种情况下,您可以将tn(options $ tab.cap)更改为paste('\n\n:', options $ tab.cap,sep ='') - 但我还没有测试过。


我在运行rmarkdown_0.3.3的RStudio中尝试了这个;我不需要\n\n后面的:,因为:会被打印出来。然而,我无法弄清楚如何让标题在表格之前(上方)。我该如何修改钩子使其起作用?对于图形,我可以使用knit_hooks$set(plot = function(x, options) { paste('<figure><figcaption>', options$fig.cap, '</figcaption><img src="', opts_knit$get('base.url'), paste(x, collapse = '.'), '"></figure>', sep = '')} - jessi
我将代码从 paste('\n\n:Table ', i, ': ', x, sep = '') 改为 paste('\n\n<caption>Table ', i, ': ', x, sep = '','</caption><p></p>'),以在标题后添加空格,删除原本打印的冒号,并保留标题格式。 - Tony Ladson
@DeanK:如果我想在目录中添加标题的简短版本,即tab.scap,你有什么建议吗?请参见https://github.com/yihui/knitr/issues/1679 - mavericks

5
您可以使用xtable来实现这一点。将caption添加到xtable并在print函数中添加comment=FALSE
print(
  xtable(
    head(iris),
    caption = 'Iris data'
  ),
  comment = FALSE,
  type = 'latex'
)

请参阅xtableprint.xtable文档以获取相关的IT技术信息。


0

我知道这个问题已经存在多年了,但如果有像我一样来到这里寻找答案的人,我会告诉你我找到的答案。

实际上非常简单,我们只需要输入:

```{r mostrarSerie,results='asis',echo=FALSE}
library(xtable)
options(xtable.floating = TRUE)
print(xtable(AP, digits = 0,caption = "Serie de tiempo"),comment = FALSE)
```

重要的步骤是将选项 xtable.floating = TRUE 放入代码中,这样 LaTeX 才能识别表格。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接