【问题标题】:R shiny : checkboxGroupInput valueR闪亮:checkboxGroupInput值
【发布时间】:2016-10-22 14:22:58
【问题描述】:

我是 R 新手,我在 Ui.R 中有这段代码:

library(shiny)

ui <- shinyUI(fluidPage(

  titlePanel("Test 1"),

  sidebarLayout(
    sidebarPanel(
      checkboxGroupInput("sex", "sex", c("Men", "Women")),
      textOutput("number")
   ),

   mainPanel(

   )
  )
))

Server.R 中的这段代码:

server <- shinyServer(function(session, input, output) {

  observeEvent(input$sex, {
    if (input$sex == "Men"){s<-1}
    number<-as.numeric(s)

    if (input$sex == "Women"){s<-2}
    number<-as.numeric(s)

    if (input$sex == "Men" & input$sex == "Women"){s<-5}
    number<-as.numeric(s)

    if (is.null(input$sex)) {s<-10}
    number<-as.numeric(s)

    output$number<-renderText({number})
  })
  })

所以,我不明白为什么当我选中两个复选框时“数字”不取值 5,以及如果我取消选中两个复选框,为什么“数字”不取值 10?

如果你能帮助我理解,请。

非常感谢。

编辑:如何取消选择 checkboxGrouInput “动态”?

library(shiny)

ui <- shinyUI(fluidPage(

  titlePanel("Test 1"),

  sidebarLayout(
    sidebarPanel(
      checkboxGroupInput(inputId = "sex", label = "sex",choices =  
                                    c("Men", "Women", "Children")),
      textOutput("number")
      ),

      mainPanel(
        checkboxGroupInput(inputId = "dynamic", label = "", choices = 
                                  list("Answer 1"="01", "Answer 2"="02", 
                                       "Answer 3"="03", "Answer 4"="04",
                                       "Answer 5"="05", "Answer 6"="06", 
                                       "Answer 7"="07", "Answer 8"="08", 
                                       "Answer 9"="09", "Answer 10"="10",
                                    "Answer 11"="11", "Answer 12"="12"))
       )
    )
  ))

和 Server.R :

server <- shinyServer(function(session, input, output) { 

  output$number<-renderText({ 

    if (is.null(input$sex) ){return(10)
      updateCheckboxGroupInput(session,"dynamic",selected=character(0))}

    men      <- "Men"       %in% input$sex
    women    <- "Women"     %in% input$sex
    children <- "Children"  %in% input$sex

    if (men & women & children){
      s <- 8
      updateCheckboxGroupInput(session,"dynamic",
                             selected=list("01","02","03","04","05","06",
                                "07","08","09","10","11","12"))

      } else if (men & women){
        s <- 5
        updateCheckboxGroupInput(session,"dynamic",
                  selected=list("01","02","03","04","05","06","07","08"))

      } else if (men){
         s <-1
         updateCheckboxGroupInput(session,"dynamic",
                                    selected=list("01","02","03","04"))

      } else if (women){
         s <-2
         updateCheckboxGroupInput(session,"dynamic",
                                    selected=list("05","06","07","08"))

       } else if (children) {
          s <- 3
          updateCheckboxGroupInput(session,"dynamic",
                                    selected=list("09","10","11","12"))
       }  

       return(as.numeric(s)) 
   })
 })

非常感谢。

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    在您的代码中需要考虑的几点:

    1) 如果同时选择了男性和女性,则 input$sex 的长度=2 (chr [1:2] "Men" "Women")。这条线行不通。

    (input$sex == "Men" & input$sex == "Women")
    

    2) 在应用程序初始化时 input$sex 为 NULL,并且您不能像在 if 语句中那样使用 null

    if (input$sex == "Men") 
    

    3) 你不需要observeEvent。 renderText 对 input$sex 有反应。

    我对你的代码做了一些修改

    library(shiny)
    
    ui <- shinyUI(fluidPage(
    
      titlePanel("Test 1"),
    
      sidebarLayout(
        sidebarPanel(
          checkboxGroupInput(inputId = "sex", label = "sex",choices =  c("Men", "Women")),
          textOutput("number")
        ),
    
        mainPanel()
      )
    ))
    
    server <- shinyServer(function(session, input, output) { 
    
      output$number<-renderText({ 
    
        if (is.null(input$sex) ){return(10)}
    
        if (length(input$sex) ==1){
            if (input$sex == "Men"){
              s<-1
            } else if (input$sex == "Women"){
              s<-2
            }
        } else{
            return(5)
        } 
    
        return(as.numeric(s))
      })
    })
    
    shiny::shinyApp(ui, server)
    

    更新 - 如果您有更多选择

    library(shiny)
    
    ui <- shinyUI(fluidPage(
    
      titlePanel("Test 1"),
    
      sidebarLayout(
        sidebarPanel(
          checkboxGroupInput(inputId = "sex", label = "sex",choices =  c("Men", "Women", "Children")),
          textOutput("number")
        ),
    
        mainPanel()
      )
    ))
    
    server <- shinyServer(function(session, input, output) { 
    
      output$number<-renderText({ 
    
        if (is.null(input$sex) ){return(10)}
    
        men      <- "Men"       %in% input$sex
        women    <- "Women"     %in% input$sex
        children <- "Children"  %in% input$sex
    
        if (men & women & children){
          s <- 8 
        } else if (men & women){
          s <- 5
        } else if (men){
          s <-1
        } else if (women){
          s <-2
        } else if (children) {
          s <- 3
        }  
    
        return(as.numeric(s)) 
      })
    })
    
    shiny::shinyApp(ui, server)
    

    【讨论】:

    • 哦,太好了!非常感谢罗恩的解释。我现在理解得更好了。还有一个问题:我必须在 checkboxGroupInput 中添加一个框:children。我如何区分选择:Men-Women/Men-Children/Women-Children,因为长度相同?再次感谢您。
    • 查看更新的代码。有更优雅的方法可以做到这一点,但这一种遵循您代码中的想法。
    • 非常感谢罗恩的帮助。你是一个国王。但是一旦我完成了我的代码,当没有选中 checkboxGroupInput “sex” 的框时,我仍然有一个关于取消选择 checkboxGroupInput “dynamic” 的小问题。我尝试了“selected = NULL, FALSE 和 character(0) 但它们都不起作用。你知道为什么吗?请看我编辑的代码。再次感谢 Ron。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 2018-01-09
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    相关资源
    最近更新 更多