Как я могу печатать на консоли при использовании knitr?

Я пытаюсь распечатать на консоль (или окно вывода) для целей отладки. Например:

\documentclass{article}

\begin{document}

<<foo>>=
print(getwd())
message(getwd())
message("ERROR:")
cat(getwd(), file=stderr())
not_a_command() # Does not throw an error?
stop("Why doesn't this throw an error?")
@


\end{document}

Я получаю результаты в выходном PDF файле, но моя проблема в том, что у меня есть script, который не завершается (поэтому нет выходного PDF файла для проверки), и я пытаюсь понять, почему. Похоже, что нет выходного файла журнала, если вязание не завершено успешно.

Я использую knitr 1.13 и Rstudio 0.99.896.

EDIT. Вышеприведенный код будет правильно выводить (и прерывать), если я перейду на Sweave, так что это заставляет меня думать, что это проблема типа knitr.

Ответ 1

Этот вопрос имеет несколько аспектов - и его отчасти проблема XY. В основе лежит вопрос (как я его читал):

Как я могу узнать, что не так, если knitr завершается сбой и не выводит выходной файл?

  • В случае выхода в формате PDF довольно часто компиляция выходного файла PDF завершается с ошибкой после возникновения ошибки, но есть промежуточный файл TEX. Открытие этого файла может привести к появлению сообщений об ошибках.
  • Как было предложено Грегором, вы можете запустить код в кусках по строкам в консоли (или куском). Однако это может не воспроизводить все проблемы, особенно если они связаны с рабочим каталогом или средой.
  • capture.output может использоваться для печати отладочной информации во внешний файл.
  • Наконец (в отличие от моего предыдущего комментария), можно распечатать в окне прогресса RStudio (или, тем не менее, он вызвал): сообщения о перехватах будут напечатаны в окне выполнения. По сути, сообщение должно поступать из knitr, а не из кода knitr.

Как распечатать информацию об отладке в окне выполнения в RStudio?

Следующий пример печатает все объекты в среде после каждого фрагмента с помощью debug = TRUE:

\documentclass{article}

\begin{document}

<<>>=
knitr::knit_hooks$set(debug = function(before, options, envir) {
  if (!before) {
    message(
      paste(names(envir), as.list(envir),
            sep = " = ", collapse = "\n"))
  }
})
@

<<debug = TRUE>>=
a <- 5
foo <- "bar"
@

\end{document}

Окно выполнения:

Окно выполнения

Конечно, для документов с более или большими объектами крюк должен быть настроен для выборочной печати (частей) объектов.