如何根据selectInput()有条件地改变Shiny wellPanel()的背景颜色?

问题描述 投票:1回答:1

我已经创建了可重现的代码来强调我所遇到的问题。我知道要改变 wellPanel(),我用 wellPanel(...,style = "background: green")比如说,我想把这个文件的背景颜色改变一下。

然而,我想改变以下的背景颜色 wellPanel() 根据所选公司的情况(selectInput())从我的数据框架中的公司选项中提取。所以,我将 wellPanel(...,style=textOutput("colour_panel")) 中,然后定义 output$colour_panel 在服务器中,其值取决于所选择的公司。

为什么背景颜色不会改变?

library(shiny)
library(dplyr)

name <- c("Company1","Company2","Company3")
price <- c("400","200","150")

my_data <- data.frame(name,price)

ui <- fluidPage(
  h1("Shiny Template"),
  sidebarLayout(
    sidebarPanel(
      selectInput("company", "Choose a Company:", choices = c(Choose="",levels(as.factor(my_data$name))))
    ),
    mainPanel(
      fluidRow(
        column(4,
               wellPanel(
                 textOutput("price"),
                 style=textOutput("colour_panel")
               ))
      )
    )
  )
)

server <- function(input, output) {

  filtered_data <-  reactive ({
    data <- my_data %>% 
      filter(name==input$company)
    data
  })

  output$colour_panel <- renderText({
    ifelse(input$company=='',
           paste0("background: grey"),
           ifelse(
             input$company=="Company1" | input$company=="Company2",
             paste0("background: green"), 
             paste0("background: red")))
  })

  output$price <- renderText({
    if(input$company==""){
      return()
    }
    else(
      filtered_data() %>% 
        select(price) %>% 
        as.integer()
    )
  })
}

shinyApp(ui, server)
r shiny
1个回答
0
投票

类似这样的东西可以解决你的问题

library(shiny)
library(dplyr)

name <- c("Company1","Company2","Company3")
price <- c("400","200","150")

my_data <- data.frame(name,price)

ui <- fluidPage(
  h1("Shiny Template"),
  sidebarLayout(
    sidebarPanel(
      selectInput("company", "Choose a Company:", choices = c(Choose="",levels(as.factor(my_data$name))))
    ),
    mainPanel(
      fluidRow(
        column(4,uiOutput("well_panel_server"))
      )
    )
  )
)


server <- function(input, output) {

  filtered_data <-  reactive ({
    data <- my_data %>% 
      filter(name %in% input$company)
    data
  })

  color_panel <- reactive(ifelse(input$company=='',
           paste0("background: grey"),
           ifelse(
             input$company=="Company1" | input$company=="Company2",
             paste0("background: green"),
             paste0("background: red"))))




  output$price <- renderText({
    if(input$company==""){
      "Select Company"
    }
    else(
      filtered_data() %>%
        pull(price) %>% 
        as.character()
    )
  })  


  output$well_panel_server <- renderUI({
      wellPanel(textOutput("price"),style = color_panel())
    })
}

shinyApp(ui, server)
© www.soinside.com 2019 - 2024. All rights reserved.