(Обновлено, чтобы отразить изменения в R 3.5.x)
Вы можете установить пользовательские средства визуализации для вывода (см. vignette("knit_print")
), но я думаю, что они не вызываются при возникновении ошибки. В этом случае вызывается общая функция wrap()
. knitr
определяет метод wrap.error()
, и до R 3.5.0 он мог быть переопределен пользователем. Однако в последней версии R методы, определенные в пакете, выбираются предпочтительнее методов, определенных пользователем, поэтому он больше не работает.
Тем не менее, есть еще решение для некоторых ошибок. Для примера в вопросе созданный объект ошибки имеет класс c("simpleError", "error", "condition")
, а knitr
не определяет метод wrap.simpleError()
. Вы можете определить один и переопределить его обработку.
Вы делаете это так:
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
wrap.simpleError <- function(x, options) {
# x is an error object, with components "call" and "message". Ignore
# the call, but wrap the result like code:
paste0("```\n## Error: ", x$message, "\n```")
}
```
```{r, error=TRUE}
notexistingvariable
```
Это отображает результат следующим образом:
![enter image description here](https://i.stack.imgur.com/jrsTj.png)
Существует также выходной хук для обработки ошибок: см. https://yihui.name/knitr/hooks/. Однако он, кажется, вызывается после wrap.error
, когда сообщение уже сформировано. Вы можете редактировать это сообщение, чтобы удалить
части, которые вы не хотите использовать, как этот код:
```{r}
knitr::knit_hooks$set(error = function(x, options) {
paste0("```\n",
sub(" in eval(expr, envir, enclos)", "", x, fixed = TRUE),
"\n```")
})
```e
Это может быть более надежным, чем wrap.simpleError
подход, который
перестанет работать, если knitr
когда-либо определит такой метод wrap.simpleError
. Он также будет обрабатывать все ошибки, а не только "simpleError"
. Имеет
недостаток в том, что его, вероятно, сложнее настроить для обработки разных типов ошибок, и он может не работать в разных локалях, где «Ошибка в» переводится на другой язык.