我试图使按钮多次闪烁(通过颜色循环显示),然后最终停止。可以模拟彩票抽奖。
最后的最终颜色将由计算确定,但是首先我需要弄清楚如何使它在停止之前先闪烁n次。
这是我尝试做的,但是它只会在一部分时间内更新颜色,例如2到3次。
library(shiny)
ui <- fluidPage(
uiOutput('ColorButton'),
actionButton(inputId = 'Generator', label = 'Show colors', style = "background-color: #fff; color: #FF0000; border-color: #FF0000;
border-width: 2px; font-size: 20px; font-weight: bolder;
border-radius: 6px; height: 60px; display: block; margin-top: 100px; margin-left: auto; margin-right: auto"
)
)
server <- function(input, output, session) {
values <- reactiveValues(go = 0)
values$color <- '#FF0000'
observe({ values$style = paste("background-color:", values$color, ";height:300px; width: 300px; border-radius: 150px;
display: block; margin-top: 100px; margin-left: auto; margin-right: auto") })
colors <- c("darkgray", "blue", "red", "green", "orange", "darkblue", "yellow", "gray20", "purple", "black", "cyan", "violet", "beige", "magenta", "pink", "brown")
observeEvent(input$Generator, { values$go <- 1 })
observeEvent(values$go, {
if(values$go > 0 & values$go < 20) {
sampled <- sample(c(1:12), 1)
values$color <- colors[sampled]
values$go <- values$go +1
Sys.sleep(0.1)
}
})
output$ColorButton <- renderUI({ actionButton(inputId = 'ColorButton', label = NULL, style = values$style)})
}
shinyApp(ui = ui, server = server)
答案 0 :(得分:0)
我稍微修改了您的示例,并将invalidateLater
和isolate
包含在一个更改颜色的观察器中,在另一个观察器中,我处理了values$go
为0的情况,因此ColorButton具有一个初始颜色。
library(shiny)
ui <- {fluidPage(
uiOutput('ColorButton'),
actionButton(inputId = 'Generator', label = 'Show colors', style = "background-color: #fff; color: #FF0000; border-color: #FF0000;
border-width: 2px; font-size: 20px; font-weight: bolder;
border-radius: 6px; height: 60px; display: block; margin-top: 100px; margin-left: auto; margin-right: auto"
)
)}
colors <- c("darkgray", "blue", "red", "green", "orange", "darkblue", "yellow", "gray20",
"purple", "black", "cyan", "violet", "beige", "magenta", "pink", "brown")
server <- function(input, output, session) {
values <- reactiveValues(go = 0)
observe({
if (values$go == 0) {
values$color <- '#FF0000'
values$go <- values$go +1
}
})
observeEvent(input$Generator, {
if (values$go == 20) {
values$color <- '#FF0000'
values$go <- 0
}
})
observe({
req(input$Generator)
invalidateLater(500, session)
isolate({
if (values$go > 0 & values$go < 20) {
sampled <- sample(c(1:12), 1)
values$color <- colors[sampled]
values$go <- values$go +1
}
})
})
observe({
values$style = paste("background-color:", values$color, ";height:300px; width: 300px; border-radius: 150px;
display: block; margin-top: 100px; margin-left: auto; margin-right: auto")
})
output$ColorButton <- renderUI({
actionButton(inputId = 'ColorButton', label = NULL, style = values$style)
})
}
shinyApp(ui = ui, server = server)