在Rmd内联输出中抑制冗长的有线表,同时保留最终的PDF

时间:2018-07-16 15:45:23

标签: r r-markdown knitr

我正在尝试让R抑制内联Rmd输出中由kable&kableExtra创建的冗长表,同时将它们保留在最终的针织PDF中。我只想用几个块来做到这一点,所以我不想走设置关闭所有内联输出的全局选项的路线。

我已经遍历了这里列出的块选项的几次迭代:https://yihui.name/knitr/demo/output/和这里:https://yihui.name/knitr/options/#plots,但是没有落在正确的块上,所以我不确定是否甚至在正确的位置看,或者我只是跳过了正确的设置。

YAML:

---
output:
  pdf_document:
    latex_engine: xelatex
---

代码:

```{r}
# Setup
library(knitr)
library(kableExtra)

# Create some data
dat <- data.frame ("A" = c(1:5),
                   "B" = c("Imagine a really long table",
                           "With at least 50 rows or so",
                           "Which get in the way in the inline output",
                           "But I want in the final PDF",
                           "Without influencing the other chunks")
                   )
# Produce the table
kable(dat, booktabs=TRUE, format="latex", longtable=TRUE) %>%
  kable_styling(latex_options="HOLD_position")
```

我不想每次运行此东西时都弹出的内联输出:

\begin{table}[H]
\centering
\begin{tabular}{rl}
\toprule
A & B\\
\midrule
1 & Imagine a really long table\\
2 & With at least 50 rows or so\\
3 & Which get in the way in the inline output\\
4 & But I want in the final PDF\\
5 & Without influencing the other chunks\\
\bottomrule
\end{tabular}
\end{table}

如果您可以想象在尝试编写代码时必须浏览50-100行,那么您会发现它变得多么烦人和费时。

1 个答案:

答案 0 :(得分:1)

此功能检测到RMarkdown文档正在RStudio中而不是通过编织内联处理:

is_inline <- function() {
  is.null(knitr::opts_knit$get('rmarkdown.pandoc.to'))  
}

所以您可以将有问题的代码包装成类似的内容

if (!is_inline()) {
  kable(dat, booktabs=TRUE, format="latex", longtable=TRUE) %>%
  kable_styling(latex_options="HOLD_position")
}

或执行其他功能

hide_inline <- function(x) {
  if (is_inline())
    cat("[output hidden]")
  else
    x
}

并将其添加到您的管道中:

kable(dat, booktabs=TRUE, format="latex", longtable=TRUE) %>%
  kable_styling(latex_options="HOLD_position") %>%
  hide_inline()

这两种方法都有一个缺点,那就是需要修改您的代码,如果echo=TRUE会显示该代码。我认为没有相当于hide_inline的块选项,但是我可能是错的。

如果您真的很绝望,则可以使用echo=2:3或类似的方法来隐藏if (!is_inline()) {}行。