Shiny 有没有办法在设定的时间段(秒)内显示绘图或图像?
我面临的问题是,我必须创建一个心理在线实验。我不会详细介绍所有的细节,但是,其中一个方面涉及到在设定的秒数内显示图像或绘图。我已经开始学习Shiny,我已经学了两个小时了,(因为我对R比较在行,这似乎是一个很好的步骤),但是我找不到一个方法来做到这一点 我知道showNotification有一个“duration”属性,但我没有找到showPlot或Image的任何内容 有没有办法做到这一点,或者我应该在没有浪费太多时间的时候退出Shiny 您好, 乔治 编辑:哇。或多或少是我想要的。谢谢大家!强> 由于我们询问了细节(谢谢),实验只需要一张图片。将有两个实验条件,两个都将有一个图显示(该图我打算用ggplot2绘制),并包含30-50个点,持续约4秒。受试者必须评估点数(因为他无法计算点数)并将其插入字段中,然后受试者必须评估某些评估参数。将重复使用以将他与其他人进行比较的数据。就这样Shiny 有没有办法在设定的时间段(秒)内显示绘图或图像?,shiny,Shiny,我面临的问题是,我必须创建一个心理在线实验。我不会详细介绍所有的细节,但是,其中一个方面涉及到在设定的秒数内显示图像或绘图。我已经开始学习Shiny,我已经学了两个小时了,(因为我对R比较在行,这似乎是一个很好的步骤),但是我找不到一个方法来做到这一点 我知道showNotification有一个“duration”属性,但我没有找到showPlot或Image的任何内容 有没有办法做到这一点,或者我应该在没有浪费太多时间的时候退出Shiny 您好, 乔治 编辑:哇。或多或少是我想要的。谢谢大家
既然现在显然可以做到这一点,我将从一个严肃的方法开始。谢谢大家! 您将能够在闪亮的灯光下完成此操作。 例如,您可以使用
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)