Когда я показываю ggplot в блестящем приложении, как мне записать предупреждение ggplot, которое появляется в консоли, и отображать в приложении? - PullRequest
0 голосов
/ 29 ноября 2018

Ниже у меня есть простое приложение, которое отображает 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(), но это не сработало.

enter image description here

1 Ответ

0 голосов
/ 29 ноября 2018

Когда вы вызываете 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)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...