R闪亮 - 基于另一个CheckboxGroupInput更新CheckboxGroupInput

时间:2015-07-22 20:41:58

标签: r shiny-server shiny

我想在用户取消选中固定变量中的变量时,在'随机变量'中包含'固定变量'的变量。这是图像http://imgur.com/zUXEJwg。没有错误消息,只要每当我尝试取消选中任何变量时,它就不会让我这么做。 有人可以帮我这个吗?

shinyServer(function(input, output,clientData, session) {
   observe({

     data<-reactive({
        file1<-input$file
        if(is.null(file1)){return()}
        read.table(file=file1$datapath,    sep=input$sep,header=input$header,stringsAsFactors=input$stringsAsFactors)
                  })

        colnames<-names(data())
        updateCheckboxGroupInput(session, "Fixed", choices = colnames, selected=colnames) 

        inputVar<-reactive({
              Fixedvar<-input$Fixed
              if(is.null(Fixedvar)){return()}
              subset<-data()[,!(colnames %in% Fixedvar)]
               col<-names(subset)
                col
                             })

       updateCheckboxGroupInput(session, "Random", choices = inputVar())
               })})



shinyUI(fluidPage(
        sidebarLayout(
              sidebarPanel( 

       fileInput("file","Please upload your file"),
       checkboxInput(inputId='header', label='header', value=TRUE),
       checkboxInput(inputId="stringsAsFactors", label="stringsAsFactors", value=FALSE),
        radioButtons(inputId='sep',label='Separator', choices=c(Comma=',',  Semicolon=';',Tab='\t',Space=''), selected=','),
        fluidRow(column(6, wellPanel(
        checkboxGroupInput("Fixed", 
                       label = "Fixed Variables","") 
           )),

        column(6, wellPanel(
        checkboxGroupInput("Random", label = "Random Variables","") 
         ) ))),


             mainPanel()
            )))

2 个答案:

答案 0 :(得分:2)

问题是您只使用observe一个。只要它内部的任何反应元素发生变化,它就会运行 - 在你的情况下,它会发生任何变化。具体来说,当您更改"Fixed"复选框组时,此部分观察也会再次运行:

colnames<-names(data())
updateCheckboxGroupInput(session, "Fixed", choices = colnames, selected=colnames)

由于您的数据未发生变化,因此只需将您的选择和所选选项设置为colnames即可。要绕过它,您需要使您的服务器更加模块化,具有单独的观察者和反应元素。这是适用于 server.R

的布局
library(shiny)

shinyServer(function(input, output, session) {

  data <- reactive({

    file1 <- input$file
    if(is.null(file1)){ return(mtcars) } # Default data for testing

    read.table(file = file1$datapath, sep = input$sep, header = input$header,
               stringsAsFactors = input$stringsAsFactors)

  })

  colnames <- reactive({ names(data()) })

  observeEvent(data(), {

    updateCheckboxGroupInput(session, "Fixed",
      choices = colnames(), selected = colnames()) 

  })

  inputVar <- reactive({

    Fixedvar <- input$Fixed

    if (setequal(colnames(), Fixedvar)) {
      # If sets are equal, return an empty string
      return("")
    } else {
      # Return elements that are only in colnames
      setdiff(colnames(), Fixedvar)
    }

  })

  observeEvent(inputVar(), {

    updateCheckboxGroupInput(session, "Random", choices = inputVar())

  })

})

我也略微改变了inputVar。如果在checkboxGroupInput中未选中任何框,则会返回NULL。因此,当input$FixedNULL时,您确实希望将"Random"中的选项更新为所有列。

但仍然存在一个问题:无论何时在第一个输入中选中或取消选中一个方框,第二个输入都会更新。这意味着它的选择也会更新 - 未经检查的所有内容。但这有点不同的问题;我想您可以使用reactiveValues来存储以前的"Random"值,并在更新输入选项时将其用作初始值。

答案 1 :(得分:0)

您可能需要观察员。每当您想要评估反应式表达式,但不需要返回值时,您必须使用观察者。一些类似观察者的例子是renderXXX函数。更多信息here

试试这个

observe({
    colnames<-names(data())
    updateCheckboxGroupInput(session, "Fixed", choices = colnames, selected=colnames)
})

# ...

observe({
    iv <- inputVar()
    updateCheckboxGroupInput(session, "Random", choices = iv)
})