Как отобразить несколько изображений (png), которые хранятся локально на Shiny - PullRequest
0 голосов
/ 20 ноября 2018

Я много раз пытался найти в Интернете похожий вопрос, но не смог найти тот, который помог бы в моем случае.Я очень новичок в Shiny, поэтому я надеюсь, что вы все можете мне помочь.Ниже приведена форма кода, который у меня есть.У меня возникли проблемы с удалением некоторых изображений локально.В пользовательском интерфейсе, который вы видите в выпадающем меню, я могу выбрать несколько округов и комбинировать их с указанием причины.В моей папке много файлов png с названием в этом общем формате: «CountyX reasonY .png» (перед расширением файла есть пробел).

Что я хочу сделать, так это уметь отображать несколько изображений в сетке, чтобы я мог сравнить комбинации округов и причин (например, см. Округ2 причина1 и округ1 причина3 и округ2 причина3 и округ4 причина2 в сетке 2x2 (или 3х4 если у меня 12 и тд)).Чтобы сделать это проще, я загрузил здесь несколько файлов png для экспериментов: PNG 1 , PNG 2 , PNG 3 , PNG 4 .

Вывод $ plots, которые я пробовал, работает только для отображения одного изображения.

library(shiny)
library(shinyWidgets)

ui <- fluidPage(
  titlePanel("Compare"),
  sidebarLayout(
    sidebarPanel(
      pickerInput(inputId = "countyInput", label = "Filter county",
                  choices = c("County1", "County2", "County3", "County4", "County5"),
                  options = list(`actions-box` = TRUE,size = 10, `selected-text-format` = "count > 9"),
                  multiple = TRUE),
      checkboxGroupInput(inputId = "reasonInput", label = "Filter reason",
                         choices = c("reason1", "reason2", "reason3"))
    ),
    mainPanel(
      plotOutput("plot")
    )
  )
)

server <- function(input, output, session) {

  output$plot <- renderImage({
    filename <- normalizePath(file.path("<local path name to png files>", paste(input$countyInput, " ", input$reasonInput, " .png", sep = "")))
    list(src = filename)  
    }, deleteFile = FALSE)

}

shinyApp(ui = ui, server = server)

Спасибо за вашу помощь.

1 Ответ

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

С помощью grid, gridExtra и png вы можете рендерить pngs в один "сюжет".

library(shiny)
library(shinyWidgets)
library(gridExtra)
library(png)
library(grid)

ui <- fluidPage(
  titlePanel("Compare"),
  sidebarLayout(
    sidebarPanel(
      pickerInput(inputId = "countyInput", label = "Filter county",
                  choices = c("County1", "County2", "County3", "County4", "County5"),
                  options = list(`actions-box` = TRUE,size = 10, `selected-text-format` = "count > 9"),
                  multiple = TRUE),
      checkboxGroupInput(inputId = "reasonInput", label = "Filter reason",
                         choices = c("reason1", "reason2", "reason3"))
    ),
    mainPanel(
      plotOutput("plot")
    )
  )
)

server <- function(input, output, session) {

  output$plot <- renderPlot({
    filename <- normalizePath(file.path("<path>", paste0(input$countyInput, " ", input$reasonInput, ".png", sep = ""))) # you had one extra space before .png
    filename <- filename[file.exists(filename)]
    pngs = lapply(filename, readPNG)
    asGrobs = lapply(pngs, rasterGrob)
    p <- grid.arrange(grobs=asGrobs, nrow = 1)
    }, width = 1000)
}

shinyApp(ui = ui, server = server)

Вам, конечно, потребуется некоторая обработка ошибок для неполных имен файлов. Кроме того, вы можете использовать length(filename) в качестве условия для nrow и ncol, чтобы получить требуемое количество ячеек в сетке.

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