在无功输出内使用setSliderColor更改滑块颜色

在无功输出内使用setSliderColor更改滑块颜色,r,shiny,reactive-programming,reactive,shinywidgets,R,Shiny,Reactive Programming,Reactive,Shinywidgets,我正在构建一个闪亮的应用程序,它有一个反应式滑块,我希望条的颜色是红色。我试图使用shinyWidgets包中的setSliderColor()函数,但它不起作用。我的假设是它不会在幻灯片上出现,因为它不是: library(shiny) library(shinyWidgets) ui <- fluidPage( setSliderColor(c("green"), sliderId = c(1)), sidebarLa

我正在构建一个闪亮的应用程序,它有一个反应式滑块,我希望条的颜色是红色。我试图使用shinyWidgets包中的setSliderColor()函数,但它不起作用。我的假设是它不会在幻灯片上出现,因为它不是:

            
library(shiny)
library(shinyWidgets)


ui <- fluidPage(
    setSliderColor(c("green"), sliderId = c(1)),

    sidebarLayout(
        sidebarPanel(
            textInput(inputId = "greeting",
                      label = "Say hi!"),
            actionButton(inputId = "submit", 
                         label = "Submit"),

            uiOutput("num_slider"),

        ),
    mainPanel()
))

server <- function(input, output) {
    
    output$num_slider <- renderUI({
        shiny::req(input$greeting)
        shiny::req(input$submit)
        if(input$greeting == "hi!") {
            
        sliderInput(inputId = "num_filter2",
                    label = "Filter by Number",
                    min = 1,
                    max = 10,
                    value = c(1, 10))
        } else {
            sliderInput(inputId = "num_filter2",
                        label = "Filter by Number",
                        min = 1,
                        max = 5,
                        value = c(1, 5))
        }
    })
    
}

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

图书馆(闪亮)
图书馆(shinyWidgets)

ui该函数不是设计用于
renderUI()
。每次调用都需要更新参数

快速修复方法是预先分配用户永远无法达到的非常大的向量(比如100万个),或者像这样使用
reactiveValues()

注意:当“hi!”作为输入传递时,滑块将变为绿色

library(shiny)
library(shinyWidgets)


ui <- fluidPage(
    
    
    sidebarLayout(
        sidebarPanel(
            textInput(inputId = "greeting",
                      label = "Say hi!"),
            actionButton(inputId = "submit", 
                         label = "Submit"),
            
            uiOutput("num_slider"),
            sliderInput(inputId = "num_filter1",
                        label = "Now it works!",
                        min = 1,
                        max = 10,
                        value = c(1, 10))
            
        ),
        mainPanel()
    ))

server <- function(input, output) {
    
    i <- reactiveValues()
    i$color <- 1
    i$color_name <- 'green'
    
    
    observeEvent(input$submit, {
        
        i$color <- c(i$color, i$color[[length(i$color)]] + 1)
        i$color_name <- c(i$color_name, 'green')
        
        #left for demonstration purposes
        print(i$color)
        print(i$color_name)
        
        shiny::req(input$greeting)
        shiny::req(input$submit)
        
        
        output$num_slider <- renderUI({

            if(input$greeting == "hi!") {
                
                fluidPage(setSliderColor(i$color_name, sliderId = i$color),
                          sliderInput(inputId = "num_filter2",
                                      label = "Filter by Number",
                                      min = 1,
                                      max = 10,
                                      value = c(1, 10)))}
            
        }) }) 
    
}

# Run the application 
shinyApp(ui = ui, server = server)
库(闪亮)
图书馆(shinyWidgets)

谢谢你让我走上正轨!在您的基础上构建的一个更简单的解决方案是简单地包装fluidPage(setSliderColor()通过始终将SliderId设置为1,围绕服务器中每个滑块输入的参数。然后,您可以轻松地单独自定义每个滑块的颜色,而无需i$color长度等。此解决方案的一个限制是:我只能使用一个滑块。在我使用两个滑块的代码中,它只编辑其中一个滑块,而保留另一个滑块如果您对为什么它只适用于一个sliderinput有任何想法,我将提出一个新问题,即如何将此解决方案扩展到多个sliderinput:
library(shiny)
library(shinyWidgets)


ui <- fluidPage(
    
    
    sidebarLayout(
        sidebarPanel(
            textInput(inputId = "greeting",
                      label = "Say hi!"),
            actionButton(inputId = "submit", 
                         label = "Submit"),
            
            uiOutput("num_slider"),
            sliderInput(inputId = "num_filter1",
                        label = "Now it works!",
                        min = 1,
                        max = 10,
                        value = c(1, 10))
            
        ),
        mainPanel()
    ))

server <- function(input, output) {
    
    i <- reactiveValues()
    i$color <- 1
    i$color_name <- 'green'
    
    
    observeEvent(input$submit, {
        
        i$color <- c(i$color, i$color[[length(i$color)]] + 1)
        i$color_name <- c(i$color_name, 'green')
        
        #left for demonstration purposes
        print(i$color)
        print(i$color_name)
        
        shiny::req(input$greeting)
        shiny::req(input$submit)
        
        
        output$num_slider <- renderUI({

            if(input$greeting == "hi!") {
                
                fluidPage(setSliderColor(i$color_name, sliderId = i$color),
                          sliderInput(inputId = "num_filter2",
                                      label = "Filter by Number",
                                      min = 1,
                                      max = 10,
                                      value = c(1, 10)))}
            
        }) }) 
    
}

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