为什么在发送错误消息时闪亮?

Why shiny breaks when messaging an error?

提问人:pietrodito 提问时间:9/28/2023 更新时间:9/28/2023 访问量:34

问:

这句简单的台词似乎没有造成任何伤害:

tryCatch( stop(), error = function(e) { message(e) } )

但是它打破了一个闪亮的应用程序,而这两行却完美地工作:

tryCatch( stop(), error = function(e) { print(e) } )
tryCatch( stop(), error = function(e) { message(e |> as.character()) } )

我不明白这里发生了什么?


最小应用程序

library(shiny)

ui <- fluidPage(
 actionButton("p", "error with print"),
 actionButton("m", "error with message"),
 actionButton("c", "error with message as character")  
)

server <- function(input, output, session) {
  
  observeEvent(input$p, {
    tryCatch( stop(), error = function(e) { print(e) } )
  })
  
  observeEvent(input$m, {
    tryCatch( stop(), error = function(e) { message(e) } )
  })
  
  observeEvent(input$c, {
    tryCatch( stop(), error = function(e) { message(e |> as.character()) } )
  })
  
}

shinyApp(ui, server)
r 闪亮 的错误处理 try-catch

评论

1赞 Konrad Rudolph 9/28/2023
Shiny 安装了自己的消息处理程序,它似乎无法正确处理类型的参数;你可以通过直接在 Shiny 应用程序中执行来引起同样的问题。 — 无论如何,在实际代码中使用(而不是 )当是条件对象时可能是一个更好的主意。simpleErrormessage(simpleError("test"))message(conditionMessage(e))message(e)e
0赞 Limey 9/28/2023
不是解释,但您可以通过替换为 来避免破损。message(...)print(.makeMessage(...))
0赞 phili_b 9/28/2023
如果你修改第二个,你会看到这是一个:给,似乎不喜欢这样。看看 和 : 但是,来自 Limey,使用起来可能更简单。在文档中“.makeMessage 是 message、warning 和 stop 用来生成文本消息的实用程序。observeEvent()tryCatch(stop("my error m"), error = function(e) { browser():message(e) } )estructuredput(e)structure(list(message = "my error m", call = doTryCatch(return(expr), name, parentenv, handler)), class = c("simpleError", "error", "condition"))message()e$messagegeterrmessage()print(.makeMessage(e))
0赞 phili_b 9/28/2023
键入 without : 您将看到 : 的来源,它比显示字符串的简单函数要复杂得多。message()message()

答: 暂无答案