我可以合并连续代码块的代码,而 rmarkdown html_document 中没有输出回显吗

sta*_*ant 8 r knitr r-markdown

在编写 rmarkdown 时,html_document我经常会显示连续的代码块,但没有输出。当这种情况发生时,就像当

  • 评估=假
  • 结果=“隐藏”

我希望代码块被“合并”。我知道ref.label = ""并且可以用它来完成,但它会使块标签变得极其复杂/沉重。

是否有一些 javascript、css、选项魔法可以帮助我实现我想要的目标?

例子:

---                                               
title: "Test"                                     
date: '`r Sys.Date()`'                            
output: html_document                             
---                                               
                                                  
# Title 1                                         
                                                  
Some text                                         
                                                  
```{r, echo = TRUE, eval = FALSE}                 
1 + 1 # eval = FALSE so no output                 
```                                               
                                                  
```{r, echo = TRUE, results = "hide"}             
1 + 2 # results hidden so no output               
```                                               
                                                  
```{r, echo = TRUE}                               
1 + 3                                             
```                                               
                                                  
Some other text                                   
                                                  
```{r, echo = TRUE, eval = FALSE}                 
1 + 4 # eval = FALSE so no output but text follows
```                                               
                                                  
Some other text                                   
                                                  
```{r, echo = TRUE}                               
1 + 4                                             
``` 
Run Code Online (Sandbox Code Playgroud)

输出

在此输入图像描述

tar*_*leb 6

一种方法是使用Lua 过滤器来合并代码块:

---
title: "Test"
date: '`r Sys.Date()`'
output:
  html_document:
    pandoc_args:
      - '--lua-filter=merge-code-blocks.lua'
---
Run Code Online (Sandbox Code Playgroud)

其中merge-code-blocks.lua包含

local code_block_sep = '\n\n'
function Blocks (blocks)
  for i = #blocks, 2, -1 do -- start at end of list
    -- Both blocks must be code blocks and share the same primary class
    if blocks[i - 1].t == 'CodeBlock' and
       blocks[i].t == 'CodeBlock' and
       blocks[i - 1].classes[1] == blocks[i].classes[1] then
      blocks[i - 1].text = blocks[i - 1].text ..
        code_block_sep ..
        blocks[i].text
      blocks:remove(i)
    end
  end
  return blocks
end
Run Code Online (Sandbox Code Playgroud)

结果文件:

结果网页的屏幕截图

code_block_sep = '\n'如果您不喜欢分隔块的空行,请设置。

这种方法的优点是它不特定于 HTML,即使对于 PDF 或 Word 输出也能继续工作。