У меня есть простое приложение ниже, которое отображает ggplot. ggplot генерирует предупреждение в консоли (см. рисунок внизу). Я хотел бы зафиксировать предупреждение и отобразить его в приложении под графиком.
Вот мой код:
library(shiny)
library(ggplot2)
ui <- fluidPage(
titlePanel("How do i output ggplot warnings? :("),
mainPanel(
plotOutput("my_plot_that_generates_warnings"),
tags$br(),
verbatimTextOutput(outputId='ggplot_warnings')
)
)
server <- function(input, output) {
messages <- reactiveValues(ggplot_warning = 'How to capture warning and display it?')
output$my_plot_that_generates_warnings <- renderPlot({
tryCatch({
ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width)) +
geom_point() +
geom_smooth()
}, message = function(e) {
messages$ggplot_warning <- e$message
}, warning = function(e) {
messages$ggplot_warning <- e$message
}, error = function(e) {
messages$ggplot_warning <- e$message
})
})
output$ggplot_warnings <- renderPrint({
cat(messages$ggplot_warning)
})
}
shinyApp(ui = ui, server = server)
Я предполагаю, что основная проблема связана с ленивой оценкой и тем фактом, что граф фактически не отображается (и генерируется предупреждение) до окончания trycatch
. На самом деле я могу получить предупреждение о появлении в verbatimTextOutput
, обернув вызов ggplot в print()
, но тогда, конечно, график не отображается.
Из-за незнания проблемы я попытался использовать force()
а не print()
но это не сработало.