如何为R Markdown代码块及输出块添加自定义标题
解决R Markdown中同时显示代码和输出时的块标题问题
我明白你的问题了——当代码块和输出块同时显示时,原来的hook只会给整个包裹容器加一个标题,没法分别给代码和输出各自带上对应的标题对吧?其实我们可以利用knitr的source和output钩子来分别处理这两部分,这样不管是单独显示代码、单独显示输出,还是两者同时显示,每个块都能拥有自己的专属标题。
以下是修改后的完整实现代码:
title: Block title output: html_document: highlight: tango
# 定义代码块(source)的钩子 knitr::knit_hooks$set(source = function(x, options) { # 如果需要显示代码(echo=TRUE)且启用了block.title if (options$echo && !is.null(options$block.title) && options$block.title) { # 标题用引擎名或自定义class.output,默认是引擎名 title <- if (!is.null(options$class.output)) options$class.output else options$engine paste0('<div><div class="block-title">', title, '</div>', x, '</div>') } else { x } }) # 定义输出块(output)的钩子 knitr::knit_hooks$set(output = function(x, options) { # 如果需要显示输出(results != "hide")且启用了block.title if (options$results != "hide" && !is.null(options$block.title) && options$block.title) { # 标题默认是"Output",也可以用自定义class.output title <- if (!is.null(options$class.output)) options$class.output else "Output" paste0('<div><div class="block-title">', title, '</div>', x, '</div>') } else { x } })
.block-title { font-weight: bold; display: block; background-color: lightgrey; padding: 5px 10px; border-radius: 3px; margin-bottom: 0; } /* 给代码块和输出块添加上边距,和标题区分开 */ pre, .knitr-output { margin-top: 0; border-top-left-radius: 0; border-top-right-radius: 0; }
示例测试
仅显示代码块
str(iris)
仅显示输出块
str(iris)
同时显示代码和输出块
str(iris)
效果说明
- 仅代码块:会显示带
r标题的代码块 - 仅输出块:会显示带
Output标题的输出内容 - 代码+输出:代码块带
r标题,输出块带Output标题,两者各自独立包裹,完美解决你遇到的问题
内容的提问来源于stack exchange,提问作者mindlessgreen
相关产品推荐
相关产品推荐

