当错误消息本身被修改为以红色打印时,如何在RMarkdown中获得打印的错误消息以折叠成一个块?
在此示例中,collapse = T
可以正常工作。
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, collapse = TRUE)
```
```{r error=T}
x <- c(1,2,3,4,5)
x * 10
X * 10
```
在此示例中,我将错误消息修改为红色(基于此answer)。但是然后它不会与其他崩溃:
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, collapse = TRUE)
knitr::knit_hooks$set(error = function(x, options) {
paste0("<pre style=\"color: red;\"><code>", x, "</code></pre>")
})
```
```{r error=T}
x <- c(1,2,3,4,5)
x * 10
X * 10
```
我尝试在特定的代码块中再次指定collapse = T
,但这也不起作用:
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, collapse = TRUE)
knitr::knit_hooks$set(error = function(x, options) {
paste0("<pre style=\"color: red;\"><code>", x, "</code></pre>")
})
```
```{r error=T, collapse = T}
x <- c(1,2,3,4,5)
x * 10
X * 10
```
答案 0 :(得分:4)
使用当前的development version of knitr(remotes::install_github('yihui/knitr')
),可以指定CSS class for error messages。这是一个示例:
```{r setup, include=FALSE}
knitr::opts_chunk$set(collapse = TRUE)
```
```{css, echo=FALSE}
.red {
color: red;
padding-top: 0;
margin-top: -15px;
border-top-color: #f5f5f5;
}
```
```{r error=T, class.error='red'}
x <- c(1,2,3,4,5)
x * 10
X * 10
```
输出:
答案 1 :(得分:3)
编织为HTML时,突出显示是在生成网站的最后一步中完成的。块的折叠是在此之前完成的。
使问题复杂化的事实是,错误像字符串一样突出显示,并且不能与实际的字符串输出区分开。
通过更改钩子来添加类(例如```{.myClass} ...source code... ```
)对我们无济于事,因为这会破坏块折叠机制,即使我修复了此问题(也可以通过简单地更改块钩子内部的正则表达式来完成) )网站渲染后,该类不再存在。
所以最后我只提出了以下内容。
---
title: "test"
output: html_document
---
<script>
$(document).ready(function() {
window.setTimeout(function() {
$(".hljs-comment:contains('####')").css("color", "red");
var tmp = $(".hljs-comment:contains('####')").text();
$(".hljs-comment:contains('####')").text(tmp.replace("####", "##"));
}, 15);
});
</script>
# Header 1
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, collapse = T)
default_hook <- knitr::knit_hooks$get("error")
knitr::knit_hooks$set(error = function(x, options) {
x <- paste0("##", x)
default_hook(x, options)
})
```
```{r error=T}
x <- c(1,2,3,4,5)
x * 10
X * 10
```
在这里,我们将错误钩子更改为在输出之前附加了两个附加的哈希。然后,在Javascript代码段中查找这些行,将字体颜色更改为红色,然后再次删除哈希。这需要15ms的延迟。为什么?如果我们立即执行代码,则带有highligh.js生成的类的元素尚不存在。所以我们必须慢一点。