我正在尝试让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行,那么您会发现它变得多么烦人和费时。
答案 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()) {
和}
行。