【发布时间】: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调用,可能还有布局)。