R闪亮的应用程序交互式照片库-无法访问多个文件一次?

zazmityj  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(91)

我正在尝试编写一个R shiny应用程序,给定一个图像文件目录,接受用户输入并决定在页面上显示哪些图像。图像的数量可能会因用户的输入而异。我选择使用“查找表”来实现这一目标,一个CSV文件,包含所有图像文件路径的名称作为一列和一个匹配用户输入的过滤列。有三个PNG文件,我的查找表(“LOOKUP_.csv”)看起来像这样。

这是我写的闪亮的应用程序,试图实现这一点:

library(shiny)
library(tidyverse)

lookup_files = read_csv("LOOKUP_.csv")

ui <- fluidPage(
  titlePanel("Images"),
  
  sidebarLayout(
    sidebarPanel(
      selectInput("label", label = "Choose a label...", choices = unique(lookup_files$label)),
      br(),
      actionButton("showImage", "Show Image(s)")
    ),
    
    mainPanel(
      uiOutput("imageDisplay")
    )
  )
)

server <- function(input, output, session) {
  
  observeEvent(input$showImage, {
    all_files = lookup_files %>% dplyr::filter(label == input$label)
    N_IMGS = nrow(all_files)
    
    output$imageDisplay = renderUI({
      lapply(seq_len(N_IMGS), function(i) {
        imageOutput(paste0("this_", i))
      })
    })
    
    for (i in seq_len(N_IMGS)) {
      output[[paste0("this_", i)]] <- renderImage(list(src = all_files$file[i], width = 400), deleteFile = FALSE)
    }
    
  })
}

shinyApp(ui, server)

字符串
这几乎是完美的。它提供了一个下拉菜单,并自动识别所有可能的值为“标签”,这样用户就不会选择错误的值。当你点击一个按钮标记为“显示图像",然后显示图像。问题是,对于标签“B”,其中有两个可用的图像(plot2.png和plot3.png),它显示plot3.png两次,而不是plot2.png和plot3.png。这可能只是一个愚蠢的错误,但我想知道是否有人有任何想法在这里。也许这甚至不是最好的方式来实现我的预期目标,我也很乐意听听其他的建议
我在Windows 11 x64上运行R 4.3.2和闪亮的1.8.0包。如果需要任何其他信息,请告诉我。

unguejic

unguejic1#

如果你用lapply改变for循环,它就可以工作了-

library(shiny)
library(tidyverse)

lookup_files = read_csv("LOOKUP.csv")

ui <- fluidPage(
  titlePanel("Images"),
  
  sidebarLayout(
    sidebarPanel(
      selectInput("label", label = "Choose a label...", choices = unique(lookup_files$label)),
      br(),
      actionButton("showImage", "Show Image(s)")
    ),
    
    mainPanel(
      uiOutput("imageDisplay")
    )
  )
)

server <- function(input, output, session) {
  
  observeEvent(input$showImage, {
    all_files = lookup_files %>% dplyr::filter(label == input$label)
    N_IMGS = nrow(all_files)
    
    output$imageDisplay = renderUI({
      lapply(seq_len(N_IMGS), function(i) {
        imageOutput(paste0("this_", i))
      })
    })
    
    lapply(seq_len(N_IMGS), function(i) {
      output[[paste0("this_", i)]] <- renderImage(list(src = all_files$file[i], width = 400), deleteFile = FALSE)
    })
  })
}

shinyApp(ui, server)

字符串
我使用了一些随机图像来生成下面的输出。
x1c 0d1x的数据

u91tlkcl

u91tlkcl2#

您可以在React中捕获图像路径,并直接在renderUI()中渲染图像。
下面是一个reprex:

library(shiny)
library(tidyverse)

lookup_files <- readr::read_csv("LOOKUP_.csv")

ui <- fluidPage(
  titlePanel("Images"),
  sidebarLayout(
    sidebarPanel(
      selectInput(
        inputId = "label",
        label = "Choose a label...",
        choices = unique(lookup_files$label)
      ),
      br(),
      actionButton(inputId = "showImage", label = "Show Image(s)"),
    ),
    mainPanel(
      uiOutput(outputId = "imageDisplay")
    )
  )
)

server <- function(input, output, session) {
  r_img_paths <- reactive({
    lookup_files |>
      dplyr::filter(label %in% input$label) |>
      dplyr::pull(file)
  }) |> bindEvent(input$showImage)

  output$imageDisplay <- renderUI({
    tagList(
      lapply(r_img_paths(), function(img_path) {
        renderImage(
          list(src = img_path, width = 400),
          deleteFile = FALSE
        )
      })
    )
  }) |> bindEvent(input$showImage)
}

shinyApp(ui, server)

字符串

相关问题