【问题标题】:How to suppress all Plotly warnings in ShinyApp如何抑制 ShinyApp 中的所有 Plotly 警告
【发布时间】:2020-11-19 11:58:39
【问题描述】:

我在 ShinyApp 中有一个 plotly 函数,它可以根据用户输入绘制不同的图(线、箱线图、小提琴图)。

由于不同的跟踪采用不同的参数并需要不同的布局,我看到了很多警告,我想禁止这些警告。这个comment 在这种情况下没有帮助。

This answer 似乎可以在 RStudio 中工作,但不能在 Shinyapp 中工作,它会将绘图打印到浏览器和 RStudio。

here 描述的解决方法有效,但感觉就像是 hack,我不在此应用中使用 shinyjs

任何其他想法,我如何才能只抑制情节消息/警告?

library(shiny)
library(plotly)

suppressPlotlyMessage <- function(p) {
  invisible(suppressMessages(suppressWarnings(print(plotly::plotly_build(p)))))
}

plotly_function <- function(df, type, mode, boxpoints) {
  p <- plot_ly(text = "text") %>%
    add_trace(data = df,
              x = ~timestamp, y = ~value,
              name = ~names, color = ~I(color),
              type = type, mode = mode,
              notched = TRUE, jitter = 0.3, boxpoints = boxpoints) %>%
    plotly::layout(barmode = 'group',
                   boxmode = 'group', boxgroupgap=0.4, violinmode  = 'group', violingroupgap =0.4,
                   showlegend = TRUE)
  # suppressPlotlyMessage(p)
  p
}

## UI ##################
ui <- fluidPage(
  checkboxInput("boxplots", "Show Plot as Boxplots"),
  conditionalPanel("input.boxplots == true",
    checkboxInput("showall", "Show all Points"),
    checkboxInput("violins", "Show Plot as Violinplots")
  ),
  actionButton("makewarning", "Create a Warning"),
  plotlyOutput("plot")
)

## SERVER ##################
server <- function(input, output, session) {
  observeEvent(input$makewarning, {
    warning("This warning should be visible")
  })
  output$plot <- renderPlotly({
    df <- data.frame(timestamp = rep(seq.POSIXt(Sys.time(), Sys.time()-1000000, length.out = 50), 2),
                     value = sin(1:50)*runif(100, 0, 50),
                     names = c(rep("name1",50), rep("name2",50)),
                     color = c(rep("#ff8300",50), rep("#5ddd40",50)))
    
    type = "scattergl"; mode = "markers+lines"
    boxpoints <- NULL
    if (input$boxplots == TRUE) {
      df$timestamp <- as.Date(df$timestamp)
      mode = NULL
      if (input$violins == TRUE) {
        type = "violin"
      } else {
        type = "box"
      }
    }
    if (input$showall) {
      boxpoints <- "all"
    }
    
    # browser()
    # plotly_function(df, type, mode, boxpoints)
    # suppressWarnings(plotly_function(df, type, mode, boxpoints))
    suppressWarnings(print(plotly_function(df, type, mode, boxpoints)))
    # suppressPlotlyMessage(plotly_function(df, type, mode, boxpoints))
    
  })
}

shinyApp(ui, server)

【问题讨论】:

  • “这条评论在这种情况下没有帮助。” - 为什么不?它确实解决了问题。当然,你可以对 renderPlotly 函数本身做同样的事情(注意它的参数是非标准评估的,所以你需要做同样的事情)。
  • 您介意告诉我如何在该应用程序中使用该评论来抑制警告吗?我没有设法做到这一点..
  • 其实我只是测试了一下,完全不行。我现在有点困惑,警告实际上是在什么时候生成的。话虽如此,我实际上强烈建议您不要忽略这些警告,因为它们是完全合法的——改为修复代码。也就是说,改变绘图代码,以便只传递属于给定跟踪类型的选项,而不是所有选项。如果这些警告被提升为错误(它们应该已经是),则您当前的代码很老套且脆弱,并且可能会在未来的 plotly 版本中中断。
  • 我不明白为什么必须修复代码,它工作得很好。 Plotly 应该忽略给定类型不需要的参数。否则我将不得不为所有不同的配置编写单独的函数调用,这对我来说似乎不合适..
  • “Plotly 应该忽略给定类型不需要的参数。” — 不。目前它会这样做,但这纯粹是偶然的:通常,R 确实 通常忽略无效的函数参数。情节确实是一个疏忽,情节作者决定在某个时候解决这个问题是完全合理的。 —“否则我将不得不为所有不同的配置编写单独的 plotly 函数调用”——这没有必要。您只需更换移动部件(即单个 add_trace 调用,可能还有布局)。

标签: r shiny plotly r-plotly


【解决方案1】:

您所说的无效评论会抑制消息,而您有警告。这对我有用:

p<-plot_ly(*your plot here*)
suppressWarnings(plotly_build(p))

【讨论】:

    猜你喜欢
    • 2021-02-08
    • 2011-01-04
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 2019-02-25
    相关资源
    最近更新 更多