Точное определение предупреждения о бесконечной рекурсии в R

#r #rstudio #warnings #stack-trace

#r #rstudio #предупреждения #трассировка стека

Вопрос:

Когда я запускаю свое блестящее приложение в RStudio, я получаю это предупреждающее сообщение:

 Warning: Error in : evaluation nested too deeply: infinite recursion / 
options(expressions=)?
  90: <Anonymous>
  

Я попытался превратить предупреждение в ошибку, чтобы я мог видеть его с

 options(warn = 2)
  

но затем RStudio вылетает с «Фатальной ошибкой».

Я попытался выполнить шаги, описанные здесь:

https://support.rstudio.com/hc/en-us/community/posts/207601737-How-to-debug-a-fatal-error-

для подключения lldb к процессу R, чтобы я мог видеть собственную трассировку стека, но подключение к процессу R также приводит к сбою RStudio с «Фатальной ошибкой».

Я перезапустил свой сеанс R и перезапустил RStudio безрезультатно.

Мои настройки:

 RStudio version 1.1.463
Debug -> On Error -> √ Error Inspector 
Tools -> Global Options
    [ ] Use debug error handler only when my code contains errors
Tools -> Global Options
    [ ] Automatically expand tracebacks in error inspector
  

Как я могу увидеть хотя бы часть трассировки стека рекурсии?

Ответ №1:

Чтобы увидеть все вызываемые функции, мы можем добавить трассировку для каждой функции в глобальной области видимости. Я поместил это перед моим вызовом shinyApp(...) :

 # ... files sourced here ... 

globalEnv <- globalenv()
# for some reason, this needs to be skipped
# or else we get an error about no stack trace
funcsToSkip <- c('server')
for (varName in ls(envir = globalEnv)) {
  if (varName %in% funcsToSkip) next
  varValue <- get(varName, envir = globalEnv)
  if (all(class(varValue) == "function")) {
    message(paste0("Tracing '", varName, "'"))
    trace(varName, where = globalEnv)
  }
}

shinyApp(...)
  

Это позволяет мне видеть, где он повторяется бесконечно.