2016-10-22 93 views
1

我是新来的R和我有这样的代码在Ui.R:[R闪亮:checkboxGroupInput价值

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)) 
    }) 
}) 

非常感谢你非常。

回答

4

一些东西在你的代码需要考虑:

1)如果男性和女性的选择,然后输入$性爱长度= 2(CHR [1:2] “男” “女”)。这条线不会工作。

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

2)在应用程序初始化输入$性为NULL,并在

if (input$sex == "Men") 

3)你不需要observeEvent你不能在if语句中使用null作为。 renderText被动地输入$ 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) 
+0

哦,太好了!非常感谢Ron的解释。我现在明白好多了。还有一个问题:我必须在checkboxGroupInput:children中添加一个框。我如何区分选择:男性 - 女性/男性 - 儿童/女性 - 儿童的长度是相同的?再次感谢你。 –

+0

查看更新的代码。有更多优雅的方法可以做到这一点,但是这个方法遵循代码中的想法。 –

+0

非常感谢Ron的帮助。你是国王。但是,一旦我完成了我的代码,当checkboxGroupInput“sex”的框没有被选中时,我仍然有一个关于取消选择checkboxGroupInput“dynamic”的小问题。我试过了“selected = NULL,FALSE和character(0),但没有一个能够工作,你知道为什么吗?请看我编辑的代码,再次感谢Ron。 –