Передайте объекты изображения через блестящий, но за пределами renderPlot - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть блестящее приложение, которое использует fileInput и magick, чтобы прочитать выбранное пользователем изображение и отобразить его в виде ggplot.

library(shiny)
library(magick)
library(ggplot2)

ui <- fluidPage(


   titlePanel(""),


   sidebarLayout(
      sidebarPanel(
        fileInput("current_image", "Choose image file")),


      mainPanel(
        plotOutput("current_image_plot")
      )
   )
)


server <- function(input, output) {

  output$current_image_plot <- renderPlot({
    req(input$current_image)
    myplot <- magick::image_read(input$current_image$datapath)
    myplot <- image_ggplot(myplot)
    return(myplot)
})
}

shinyApp(ui = ui, server = server)

Однако я бы хотел отделить логику c чтения изображения от логики c построения изображения. Я попытался поместить image_read в его собственный observeEvent, но это выдало ошибку The 'image' argument is not a magick image object.

Я знаю, что когда я печатаю class(myplot) в observeEvent, он возвращает объект magick-image Так что же изменилось к тому времени, когда я пытаюсь получить доступ к active_image?

library(shiny)
library(magick)
library(ggplot2)

ui <- fluidPage(


   titlePanel(""),

   sidebarLayout(
      sidebarPanel(
        fileInput("current_image", "Choose image file")),


      mainPanel(
        plotOutput("current_image_plot")
      )
   )
)


server <- function(input, output) {

  active_image <- observeEvent(input$current_image, {
    req(input$current_image)
    myplot <- magick::image_read(input$current_image$datapath)
    return(myplot)
  })

  output$current_image_plot <- renderPlot({
    req(input$current_image)
    myplot <- image_ggplot(active_image)
    return(myplot)
})
}

shinyApp(ui = ui, server = server)

1 Ответ

0 голосов
/ 06 апреля 2020

observeEvent не возвращает объект. Используйте eventReactive вместо, то есть замените

  active_image <- observeEvent(input$current_image, {
    req(input$current_image)
    myplot <- magick::image_read(input$current_image$datapath)
    return(myplot)
  })

на

  active_image <- eventReactive(input$current_image, {
    req(input$current_image)
    myplot <- magick::image_read(input$current_image$datapath)
    return(myplot)
  })

или более кратко:

  active_image <- eventReactive(input$current_image, {
    req(input$current_image)
    magick::image_read(input$current_image$datapath)
  })

Теперь active_image является реактивным проводник, это не возвращаемое значение. Вы должны сделать active_image(), чтобы получить возвращаемое значение:

  output$current_image_plot <- renderPlot({
    req(input$current_image)
    image_ggplot(active_image())
  })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...