R Shiny 中的图像幻灯片

Image slideshow in R Shiny

我还在学习R,所以请这个平台的专家帮助我。

我正在尝试在 Shiny 的面板中创建 .jpg 图像的幻灯片。当我在 RStudio 中 运行 时,下面的代码在 RStudio 的 Plot window 中显示幻灯片。

folder <- "D:/Photos/Foreign Trips/2014_07_08_USA_Irvine/JulyAugust/" 
file_list <- list.files(path=folder, pattern="*.jpg", full.names = TRUE)
for (j in 1:30) {
        myJPG <- stack(file_list[[j]])
        plotRGB(myJPG)
}

但是,当我尝试将相同的代码放入 server.R 并尝试通过 ui.R 调用时,我没有得到幻灯片或任何图像显示。单击选项卡 "Photo Slides" 时出现空白页。我尝试使用 renderUI、renderImage 和 renderPlot,但 none 有效。

ui.R

tabPanel("Photo Slides",
plotOutput("trvImg")
),

server.R

output$trvImg <- renderPlot({
folder <- "D:/Photos/Foreign Trips/2014_07_08_USA_Irvine/JulyAugust/" 
file_list <- list.files(path=folder, pattern="*.jpg", full.names = TRUE)
for (j in 1:30) {
myJPG <- stack(file_list[[j]])
plotRGB(myJPG)
}

作为一名学习者,我肯定我哪里出错了,因此寻求您的帮助。

谢谢

library(shiny)

imgs <- list.files("D:/Photos/Foreign Trips/2014_07_08_USA_Irvine/JulyAugust/", pattern=".png", full.names = TRUE)

ui <- fluidPage(

  titlePanel("Slideshow"),

  sidebarLayout(
    sidebarPanel(
      actionButton("previous", "Previous"),
      actionButton("next", "Next")
    ),

    mainPanel(
      imageOutput("image")
    )
  )
)

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

  index <- reactiveVal(1)

  observeEvent(input[["previous"]], {
    index(max(index()-1, 1))
  })
  observeEvent(input[["next"]], {
    index(min(index()+1, length(imgs)))
  })

  output$image <- renderImage({
    x <- imgs[index()] 
    list(src = x, alt = "alternate text")
  }, deleteFile = FALSE)
}

# Run the application 
shinyApp(ui = ui, server = server)

如果你想要图片下方的按钮,你可以这样做:

  sidebarLayout(
    sidebarPanel(
      # actionButton("previous", "Previous"),
      # actionButton("next", "Next")
    ),

    mainPanel(
      imageOutput("image"),
      fluidRow(
        column(1, offset=1, actionButton("previous", "Previous")),
        column(1, offset=1, actionButton("next", "Next"))
      )
    )
  )

另一个解决方案,使用 slickR 包(基于 slick javascript library)。

library(shiny)
library(slickR)

ui <- fluidPage(
   sidebarLayout(
      sidebarPanel(
        ####
      ),

      mainPanel(
         slickROutput("slickr", width="500px")
      )
   )
)

server <- function(input, output) {

  output$slickr <- renderSlickR({
    imgs <- list.files("D:/Photos/Foreign Trips/2014_07_08_USA_Irvine/JulyAugust/", pattern=".png", full.names = TRUE)
    slickR(imgs)
  })

}

# Run the application 
shinyApp(ui = ui, server = server)

我想做同样的事情,但需要静态 html 输出所以不能使用 Shiny。我创建了一个简单的 revealjs 演示文稿,然后将其作为 iframe 包含在 flexdashboard 中。

揭示:

---
title: 
output: 
  revealjs::revealjs_presentation:
    transition: convex
    reveal_options:
      loop: true
      autoSlide: 3000
      keyboard: false
      progress: false
      shuffle: true
      embedded: true
---

```{r setup, include=FALSE}
library(tidyverse)
library(glue)
library(pander)
```

```{r echo = FALSE, results ='asis'}
files <- list.files(path="./path/to/dir", full.names = TRUE)
headers <- lapply(files,
                  function(f){glue("{data-background='{{f}}'}", 
                                   .open = "{{", 
                                   .close = "}}")
                              }) 
pandoc.header(headers, 2)
```

然后在我的 flexdashboard 中添加:

```{r}
tags$iframe(style = "height:400px; width:100%; scrolling=yes", 
            src ="./imageSlider.html")
```