代码之家  ›  专栏  ›  技术社区  ›  Mark

在R中连续多次更新UI

  •  3
  • Mark  · 技术社区  · 7 年前

    我试着让一个按钮闪烁几次(在颜色中循环),最后才停下来。有点像彩票抽奖。

    最终的颜色将由计算确定,但首先我需要弄清楚如何使其在停止之前闪烁最初的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)
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   SeGa    7 年前

    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)