Свернуть сообщение об ошибке в один блок, когда сообщение об ошибке изменено, чтобы напечатать красным - PullRequest
0 голосов
/ 04 марта 2019

Как получить распечатанное сообщение об ошибке в 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, "
")})` `` `` `{r error = T} x <- c (1,2,3,4,5) x *10 X * 10 `` `</code>

Я попытался снова указать 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, "
")}) `` ``` `{r ошибка = T, коллапс = T} x <- c (1,2,3,4,5) x * 10 X * 10` `` </code>

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

С текущей версией разработки knitr (remotes::install_github('yihui/knitr')) вы можете указать класс CSS для сообщений об ошибках .Вот пример:

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

0 голосов
/ 04 марта 2019

При вязании на 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 мы ищем эти строки, меняем цвет шрифта на красный и снова удаляем хэши.Это делается с задержкой 15 мс.Зачем?Если мы немедленно выполним код, элементы, несущие классы, созданные с помощью highligh.js, еще не будут представлены.Таким образом, мы должны быть немного медленнее.

enter image description here

...