Подавление длинных таблиц Kable во встроенном выводе Rmd с сохранением в окончательном PDF-файле

Я пытаюсь заставить R подавить длинные таблицы, созданные с помощью kable и kableExtra, во встроенном выводе Rmd, сохраняя их в окончательном связанном 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 строк этого материала при попытке написать код, вы можете увидеть, насколько это раздражает и отнимает много времени.


person bcarothers    schedule 16.07.2018    source источник


Ответы (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()) { и }.

person user2554330    schedule 18.07.2018