【问题标题】:R trycatch() in place with err and warn handlers but Shiny still crashes?R trycatch() 使用 err 和 warn 处理程序,但 Shiny 仍然崩溃?
【发布时间】:2015-07-14 08:14:15
【问题描述】:

复制:

#app.R
library(shiny)
library(RODBC)
savefunc <- function() {
      conn <- odbcConnect(...) #put in a conn string u know works
      df = data.frame(testing=c("testing"))
      columnTypes = list(testing="varchar(128)")
      tryCatch(
        {
          sqlSave(conn, dat=df, tablename ="...", #put in a pre-existing tbl
            rownames = FALSE, colnames = FALSE, append=TRUE, varTypes=columnTypes)
        },
        err=function(errorCondition) {
          cat("in err handler")
          message(errorCondition)
        },
        warn=function(warningCondition) {
           cat("in warn handler")
          message(warningCondition)
        },
        finally={
          odbcClose(conn)
        }
      )
    }

server <- function(input, output) {
  observeEvent(input$doBtn, {
    savefunc()
  })
}

ui <- shinyUI(fluidPage(
  mainPanel(
    actionButton("doBtn", "Do something")
  )
))

shinyApp(ui = ui, server = server)

没有发现错误...虽然 R 似乎仍在运行(没有崩溃),但当您查看 Shiny 应用程序/用户界面时,您会发现它已经死了。控制台中的错误类似于:

Warning: Unhandled error in observer: unable to append to table xxx
observeEvent(input$doBtn)

(根据上面的示例,您可能会得到一些稍微不同的东西)但关键是错误现在会以闪亮的形式传播给观察者。有没有办法让闪亮的应用程序本身也进行故障转移?或者抑制观察者内部的错误?

【问题讨论】:

  • 这里有同样的经历。你找到解决办法了吗?
  • @jim 不。抱歉 - 我最终放弃了,只是摆脱了整个 trycatch 块。

标签: r try-catch shiny


【解决方案1】:

我只是有一个非常相似的经历(未捕获的错误),事实上,只需将err=function(e) 替换为error=function(e)(我猜warnwarning 也是如此) .


编辑

我实际上只是尝试使用您的代码,对我来说,当我这样做时它可以工作:

savefunc <- function() {
    tryCatch({
        conn <- odbcConnect(...)
        df = data.frame(testing=c("testing"))
        columnTypes = list(testing="varchar(128)")
        tryCatch({
            sqlSave(conn, dat=df, tablename="...", rownames=FALSE, colnames=FALSE, append=TRUE, varTypes=columnTypes)
        }, error=function(e) {
            cat(paste("in err handler\n"),e)
        }, warning=function(w) {
            cat(paste("in warn handler\n"),w)
        }, finally={
            odbcClose(conn)
        })
    }, error=function(e) {
        cat(paste("in err handler2\n"),e)
    }, warning=function(w) {
        cat(paste("in warn handler2\n"),w)
    })
}

它显然很脏,我不确定它为什么会起作用。我刚刚摆脱了message() 调用并封装了两个trycatch()。 也许值得一试。

【讨论】:

  • hrm...刚试了一下。即使切换到“错误”和“警告”,闪亮的应用程序仍然会死机。 :-/
  • 基本上解决方案是混合的:(1)如上所示使用“错误”和“警告”,但(2)不要尝试使用消息输出错误( )或猫();这些只会生成一个未被捕获的新错误,并且应用程序会死掉。在 cat 的情况下,这是因为 arg 是一个列表,无法处理。在 message() 的情况下,我不知道。 prolly 类似的东西。感谢您的调查!
  • @rstruck 的评论帮助了我。如果你确实想要有日志,你可以使用print,因为这不会杀死 ShinyApp。
【解决方案2】:

当我在闪亮中使用 tryCatch 时,我得到了同样的错误。实际上。当我删除错误部分和警告部分message(cond) 的一些代码时。我的闪亮不再破碎了。

  • 旧版本:
  out <- tryCatch({
    temp_t_test_result <- t.test(formula(paste0("`", temp_colnames,"`~group")), data = temp_data)

  },
  error=function(cond) {
    message(paste("colnames caused a warning:", temp_colnames))
    message(cond)

  },
  warning=function(cond) {
    message(paste("colnames caused a warning:", temp_colnames))
    message(cond)
    
  },
  finally={
    message(paste("Processing colnames: ", temp_colnames))
  })
  • 新版本:
  out <- tryCatch({
    temp_t_test_result <- t.test(formula(paste0("`", temp_colnames,"`~group")), data = temp_data)

  },
  error=function(cond) {
    message(paste("colnames caused a warning:", temp_colnames))
    # message(cond)

  },
  warning=function(cond) {
    message(paste("colnames caused a warning:", temp_colnames))
    # message(cond)
    
  },
  finally={
    message(paste("Processing colnames: ", temp_colnames))
  })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-10
    • 2015-09-30
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    相关资源
    最近更新 更多