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

Color box()基于来自闪亮应用程序中box()内的小部件的值

  •  0
  • firmo23  · 技术社区  · 3 年前

    在 shiny 下面的应用程序我根据的值为框上色 sliderInput() 其中包括 box() 。问题是,如果该框没有值,则最初不会显示该框。

    ## app.R ##
    library(shiny)
    library(shinydashboard)
    library(shinydashboardPlus)
    
    ui <- dashboardPage(
      dashboardHeader(),
      dashboardSidebar(),
      dashboardBody(
        tags$head(
          tags$style(HTML("
                          
                          #mybox2Red{border-top-style: none; border-left-color: red; border-left-style: solid;}
                          #mybox2Green{border-top-style: none; border-left-color: green; border-left-style: solid;}
                          "))
          ),
        
        uiOutput("box2")
          )
          )
    
    
    server <- function(input, output) { 
      
      
      output$box2<-renderUI({
        req(input$vr)
        if(input$vr<=5){
          tags$style(
            type = 'text/css',
            "#mybox2Red{border-top-style: none; border-left-color: red; border-left-style: solid;}"
          )
          box(
            id="mybox2Red",
            title = "title", 
            closable = TRUE, 
            width = 10,
            status = "danger", 
            solidHeader = F, 
            collapsible = TRUE,
            collapsed = T,
            sliderInput("vr","Set value range",min = 0,max=10,value =  5)
          )
        }
        else{
          tags$style(
            type = 'text/css',
            "#mybox2Green{border-top-style: none; border-left-color: green; border-left-style: solid;}"
          )
          box(
            id="mybox2Green",
            title = "title", 
            closable = TRUE, 
            width = 10,
            status = "danger", 
            solidHeader = F, 
            collapsible = TRUE,
            collapsed = T,
            sliderInput("vr","Set value range",min = 0,max=10,value =  5)
            
          )
        }
      })
    }
    
    shinyApp(ui, server)
    
    0 回复  |  直到 3 年前
        1
  •  1
  •   Jan    3 年前

    如果您将该值中继到可以轻松完成的无功值上。现在您可以初始化 ValueRange 的外部 renderUI 你用这种方式规避了这个问题。

    我更改了 renderUI 一点。使用 if 这样做需要维护两次dame代码。除非你打算在这两个方框中添加更多的差异,否则它在未来会更容易(更容易阅读)。现在条件只会改变框id。但是,当然,如果它对你的想法没有意义,你可以忽略它。

    请注意,滑块的每次更新都会折叠框,因为 collapsed = T .

    ## app.R ##
    library(shiny)
    library(shinydashboard)
    library(shinydashboardPlus)
    
    ui <- dashboardPage(
      dashboardHeader(),
      dashboardSidebar(),
      dashboardBody(
        tags$head(
          tags$style(HTML("
          #mybox2Red{border-top-style: none; border-left-color: red; border-left-style: solid;}
          #mybox2Green{border-top-style: none; border-left-color: green; border-left-style: solid;}
          "))
        ),
        uiOutput("box2")
      )
    )
    
    
    server <- function(input, output) {
      ValueRange <- reactiveVal(5)
      
      observeEvent(input$vr, ValueRange(input$vr))
      
      output$box2 <- renderUI({
        req(ValueRange)
    
        box(
            id=ifelse(input$vr<=5, "mybox2Red", "mybox2Green"),
            title = "title", 
            closable = TRUE, 
            width = 10,
            status = "danger", 
            solidHeader = F, 
            collapsible = TRUE,
            collapsed = T,
            sliderInput("vr","Set value range", min = 0, max=10, value =  ValueRange())
          )
      })
    }
    
    shinyApp(ui, server)
    
    推荐文章