Выбранные локальные файлы не отображают приложение Shiny с другими критериями - PullRequest
0 голосов
/ 14 декабря 2018

Я много раз пытался найти в Интернете похожий вопрос, но не смог найти тот, который помог бы в моем случае.Я очень новичок в Shiny, поэтому я надеюсь, что вы все можете мне помочь.Ниже приведена форма кода, который у меня есть.

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)

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

В моем случае я знаю, что эти файлы есть на моем компьютере.:

  • округ1 причина1
  • округ1 причина2
  • округ1 причина3
  • округ1 причина4
  • округ2 причина1
  • County2, причина 4

Однако в Shiny, когда я выбираю отображение County1 & 2 и отметки галочки1 & 4, я вижу только

  • County1 причина1
  • County2 причина 4

вместо

  • округ1 причина1
  • округ1 причина 4
  • округ2 причина1
  • округ2 причина 4

, хотя я знаю, что эти файлы существуют (как я упоминал выше).

Я загрузил несколько файлов для экспериментов: County1 reason1 , County1 reason2 , округ1 причина3 , округ1 причина4 , округ2 причина1 , County2 reason4

Это лучшее, что я могу описать в моей проблеме.Надеюсь, вы можете помочь.Спасибо.

1 Ответ

0 голосов
/ 15 декабря 2018

При написании Shiny-приложения всегда полезно следовать принципам реактивного программирования (часто используя reactives(), но это не единственное требование) и очищать ввод с помощью req() (см. здесь ) как можно больше.

Ваш вопрос о наличии конкретной комбинации в именах файлов больше связан с R, чем с Shiny.Использование paste() с lapply() должно быть достаточным для достижения того, что вам нужно.С другой стороны, как правило, вы не должны оставлять пробелы в именах файлов, использовать дефис или подчеркивание, если это необходимо.

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(
      uiOutput("images")
    )
  )
)

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

  file_name <- reactive({
    req(input$countyInput)
    req(input$reasonInput)
    paste0(unlist(lapply(input$countyInput, function(i) {
      paste0(i, input$reasonInput)
    })), ".png")
  })

 # creating multiple outputs:
  output$images <- renderUI({
    tagList(
      lapply(file_name(), function(file) {
        output[[paste("img", file, sep = "_")]] <- renderImage({

          filename <- file.path(Sys.getenv("HOME"), file)
          # validation intermed objects and msg displayed in UI:
          shiny::validate(
            shiny::need(file.exists(filename), "File not found.")
          )

          list(src = filename,
               alt = paste("Image name", file))
        }, deleteFile = FALSE) # we don't want Shiny to delete our file after read.
      })
    )
  })
}

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