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

时间:2019-03-04 04:47:56

标签: r r-markdown knitr

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

2 个答案:

答案 0 :(得分:4)

使用当前的development version of knitrremotes::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
```

输出:

Custom class for errors in knitr

答案 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生成的类的元素尚不存在。所以我们必须慢一点。

enter image description here