当错误消息被修改为以红色打印时,将错误消息折叠成一个块

Collapse error message into a single block when the error message is modified to print in red

当错误消息本身被修改为以红色打印时,如何让 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
```

在此示例中,我将错误消息修改为红色格式(基于此)。但是它并没有和其他的一起崩溃:

```{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
```   

编织到HTML时,突出显示是在最后一步生成站点时完成的。块的折叠在此之前完成。

使问题复杂化的是,错误就像字符串一样被突出显示,无法与实际的字符串输出区分开来。

通过更改钩子(如 ```{.myClass} ...source code... ```)添加 classes 对我们没有帮助,因为这会破坏块折叠机制,即使我解决了这个问题(可以通过简单地更改来完成块挂钩内的底层正则表达式)当网站呈现时,class 不再存在。

所以最后我只想到了以下。

---
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 片段中查找这些行,将字体颜色更改为红色并再次删除散列。这是通过 15 毫秒的延迟完成的。为什么?如果我们立即执行代码,携带 highligh.js 生成的 classes 的元素还不存在。所以我们得慢一点。

与当前development version of knitr (remotes::install_github('yihui/knitr')), you can specify the 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
```

输出: