Как мне отловить ошибки во встроенном фрагменте кода в R Markdown? - PullRequest
2 голосов
/ 26 мая 2020

Я выполняю пакетный рендеринг ряда файлов Rmd в al oop с использованием rmarkdown::render, и мне нужно иметь возможность получать вывод даже для тех, у кого есть ошибки во встроенном коде. Я не могу вручную редактировать встроенный код, чтобы включить такие вещи, как try(), поэтому нужен какой-то крючок для вязания.

Я попытался написать встроенный knit_hook, который бы вылавливал ошибки встроенного кода, но это не работает потому что выражение вычисляется до того, как оно передается в функцию-перехватчик.

Любые предложения будут очень признательны.

Спасибо!

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Думаю, я понял это в конце концов. Хитрость заключается в том, чтобы установить оба крючка inline и evaluate.inline. Ниже evaluate.inline - это отредактированная функция по умолчанию, которая добавляет try() к оценке. Затем ловушка inline проверяет выходной класс и, если это "try-error", возвращает объект as.vector (без атрибутов):

knitr::knit_hooks$set(
  evaluate.inline = function (code, envir = knit_global()) {
    v = try(eval(xfun::parse_only(code), envir = envir))
    knitr::knit_print(v, inline = TRUE, options = knitr::opts_chunk$get())
  },
  inline = function(x) {
  if (any(class(x) == "try-error")) {
    as.vector(x)
  } else x
})

Надеюсь, другие сочтут это полезным.

0 голосов
/ 26 мая 2020

Так же, как в обычном коде?

---
title: 'Hello World'
---

This mistake is caught: `r tryCatch(stop("foo"), error = function(e) "caught!")`

This mistake is silent: `r try(stop("foo"), silent = TRUE)`
...