Когда я показываю ggplot в блестящем приложении, как мне записать предупреждение ggplot, которое появляется в консоли, и отображать в приложении?
У меня есть простое приложение ниже, которое отображает 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()
но это не сработало.
Ответы
Ответ 1
Когда вы вызываете ggplot
он создает объект типа ggplot
, насколько я понимаю, внутренне сообщения не генерируются, пока вы не ggplot
print()
для объекта. Там есть объяснение аналогичной проблемы с сообщениями, поэтому прочитайте. Почему ggplot не позволяет подавлять сообщения, генерируемые его geoms? ,
Что мы можем сделать, это явно распечатать ggplot
и захватить сообщения
library(shiny)
library(ggplot2)
ui <- fluidPage(
titlePanel("This is now fixed :)"),
mainPanel(
plotOutput("my_plot_that_generates_warnings"),
tags$br(),
verbatimTextOutput(outputId='ggplot_warnings')
)
)
server <- function(input, output) {
data <- reactive({
ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width)) +
geom_point() +
geom_smooth()
})
dataerrors <- reactive({
tryCatch({
print(data())
}, message = function(e) {
return(e$message)
}, warning = function(e) {
return(e$message)
}, error = function(e) {
return(e$message)
})
})
output$my_plot_that_generates_warnings <- renderPlot({
data()
})
output$ggplot_warnings <- renderPrint({
dataerrors()
})
}
shinyApp(ui = ui, server = server)