Shiny 有没有办法在设定的时间段(秒)内显示绘图或图像?

Shiny 有没有办法在设定的时间段(秒)内显示绘图或图像?,shiny,Shiny,我面临的问题是,我必须创建一个心理在线实验。我不会详细介绍所有的细节,但是,其中一个方面涉及到在设定的秒数内显示图像或绘图。我已经开始学习Shiny,我已经学了两个小时了,(因为我对R比较在行,这似乎是一个很好的步骤),但是我找不到一个方法来做到这一点 我知道showNotification有一个“duration”属性,但我没有找到showPlot或Image的任何内容 有没有办法做到这一点,或者我应该在没有浪费太多时间的时候退出Shiny 您好, 乔治 编辑:哇。或多或少是我想要的。谢谢大家

我面临的问题是,我必须创建一个心理在线实验。我不会详细介绍所有的细节,但是,其中一个方面涉及到在设定的秒数内显示图像或绘图。我已经开始学习Shiny,我已经学了两个小时了,(因为我对R比较在行,这似乎是一个很好的步骤),但是我找不到一个方法来做到这一点

我知道showNotification有一个“duration”属性,但我没有找到showPlot或Image的任何内容

有没有办法做到这一点,或者我应该在没有浪费太多时间的时候退出Shiny

您好, 乔治

编辑:哇。或多或少是我想要的。谢谢大家!

由于我们询问了细节(谢谢),实验只需要一张图片。将有两个实验条件,两个都将有一个图显示(该图我打算用ggplot2绘制),并包含30-50个点,持续约4秒。受试者必须评估点数(因为他无法计算点数)并将其插入字段中,然后受试者必须评估某些评估参数。将重复使用以将他与其他人进行比较的数据。就这样


既然现在显然可以做到这一点,我将从一个严肃的方法开始。谢谢大家!

您将能够在闪亮的灯光下完成此操作。 例如,您可以使用
reactiveTimer

if (interactive()) {

  ui <- fluidPage(
    plotOutput("plot")
  )

  server <- function(input, output) {

    # every 2 seconds.
    autoHide <- reactiveTimer(2000)

    display <- TRUE

    observe({
      # re-execute this reactive expression every time the
      # timer fires.
      autoHide()
      display <- if_else(display,FALSE,TRUE)
    })

    output$plot <- renderPlot({
      autoHide()
      if(display){
      hist(rnorm(200))
      } else {
        hist(rnorm(100))
      }
    })
  }

  shinyApp(ui, server)
}
if(交互式()){

ui这里有一个使用
slick.js
JavaScript库的解决方案。您必须下载zip文件,并将其解压缩到应用程序的
www
子文件夹中

library(shiny)

# images to be displayed ####
## these images are in the www subfolder
images <- c("img1.JPG", "img2.JPG", "img3.JPG", "img4.JPG", "img5.JPG")

# ui #####
ui <- fluidPage(
  tags$head(
    tags$link(rel="stylesheet", type="text/css",
              href="slick-1.8.1/slick/slick-theme.css"),
    tags$link(rel="stylesheet", type="text/css",
              href="slick-1.8.1/slick/slick.css"),
    tags$script(type="text/javascript", 
                src="slick-1.8.1/slick/slick.js"),
    tags$script(HTML(
"$(document).ready(function(){
  $('#images').slick({
    arrows: true,
    dots: true,
    slidesToShow: 1,
    slidesToScroll: 1,
    autoplay: true,
    autoplaySpeed: 500,
    infinite: false
  }).on('afterChange', function(e, slick, cur){
      if(cur === slick.$slides.length-1){
        slick.setOption('autoplay', false, true);
    }
  });
});")),
    tags$style(HTML(
"#images .slick-prev {
    position:absolute;
  top:65px; 
  left:-50px;
}
#images .slick-next {
  position:absolute;
  top:95px; 
  left:-50px;
}
.slick-prev:before, .slick-next:before { 
    color:red !important;
    font-size: 30px;
}
.content {
    margin: auto;
    padding: 2px;
    width: 90%;
}"))
  ),
  sidebarLayout(

    sidebarPanel(
      # empty sidebar #
    ),

    mainPanel(
      tags$div(class="content",
               do.call(function(...) tags$div(id="images", ...), 
                       lapply(seq_along(images), function(i){
                         uiOutput(paste0("img",i))
                       })
               )
      )
    )
  )
)

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

  lapply(seq_along(images), function(i){
    output[[paste0("img",i)]] <- renderUI({
      tags$img(src = images[i], width = "400px", height = "400px")
    })
  })

}

# Run the application #### 
shinyApp(ui = ui, server = server)
库(闪亮)
#要显示的图像####
##这些图像位于www子文件夹中

图像你的意思是一个接一个地显示一个图像?有多少个图像?是一个固定的数字吗?请参见
?invalidateLater
非常感谢!实验只需要一个图像。将有两个实验条件,两个都有一个图要显示(我打算用ggplot2绘制的图)并包含30-50个点数,持续约4秒。受试者必须评估点数(因为他无法计算点数)并将其插入字段中,然后受试者必须评估某些评估参数。这些数据将被重用以将他与其他人进行比较。就是这样!
library(shiny)

# images to be displayed ####
## these images are in the www subfolder
images <- c("img1.JPG", "img2.JPG", "img3.JPG", "img4.JPG", "img5.JPG")

# ui #####
ui <- fluidPage(
  tags$head(
    tags$link(rel="stylesheet", type="text/css",
              href="slick-1.8.1/slick/slick-theme.css"),
    tags$link(rel="stylesheet", type="text/css",
              href="slick-1.8.1/slick/slick.css"),
    tags$script(type="text/javascript", 
                src="slick-1.8.1/slick/slick.js"),
    tags$script(HTML(
      "function runSlick(x){
  $('#images').slick({
    arrows: true,
    dots: true,
    slidesToShow: 1,
    slidesToScroll: 1,
    autoplay: true,
    autoplaySpeed: 500,
    infinite: false
  }).on('afterChange', function(e, slick, cur){
      if(cur === slick.$slides.length-1){
        slick.setOption('autoplay', false, true);
    }
  });
};
Shiny.addCustomMessageHandler('runSlick', runSlick);")),
    tags$style(HTML(
      "#images .slick-prev {
    position:absolute;
  top:65px; 
  left:-50px;
}
#images .slick-next {
  position:absolute;
  top:95px; 
  left:-50px;
}
.slick-prev:before, .slick-next:before { 
    color:red !important;
    font-size: 30px;
}
.content {
    margin: auto;
    padding: 2px;
    width: 90%;
}"))
  ),

  sidebarLayout(

    sidebarPanel(
      actionButton("go", "Go!")
    ),

    mainPanel(
      conditionalPanel(
        "input.go > 0",
        tags$div(class="content",
                 do.call(function(...) tags$div(id="images", ...), 
                         lapply(seq_along(images), function(i){
                           uiOutput(paste0("img",i))
                         })
                 )
        )
      )
    )
  )
)

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

  lapply(seq_along(images), function(i){
    output[[paste0("img",i)]] <- renderUI({
      tags$img(src = images[i], width = "400px", height = "400px")
    })
  })

  observeEvent(input[["go"]], {
    session$sendCustomMessage("runSlick", "")
  }, once = TRUE)

}

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