来自renderUI的Shiny聚合数据checkboxGroupInput

时间:2018-05-06 21:07:41

标签: r shiny shinyjs

为了简单起见,我有四个checkboxGroupInput()小部件。现在,所有四个都在UI中呈现,但B隐藏了shinyjs::hidden()。在服务器中,我动态取消隐藏B以响应A中的选择。

当用户点击提交按钮时,我的问题与将A和B中的选择拉到一个data.frame和C和D到另一个data.frame中有关。它做了一些我不了解A和B选择的事情。

这是我的MWE。

choices <- letters[1:4]

UI

ui <- fluidPage(
  shinyjs::useShinyjs(),
  textInput("obj", "Object ID", value=""),
  checkboxGroupInput("A", "Atr A", choices, multiple=TRUE),
  shinyjs::hidden(div(id="dB", checkboxGroupInput("B", "Atr B", choice, multiple=TRUE),
  checkboxGroupInput("C", "Atr C", choices, multiple=TRUE),      
  checkboxGroupInput("D", "Atr D", choices, multiple=TRUE),
  actionButton("submit", "Submit", class = "btn-primary"))
  )

服务器

server <- function(input, output, session) {
  # Hide/Unhide B
  observeEvent(input$A, ignoreNULL = F,
        {if("a" %in% input$A) {shinyjs::show("dB")
          } else {shinyjs::hide("dB")}
          })

  # Aggregate all form data
  fields <- c("obj","A","B","C","D")
  formData <- reactive({
                       data <- sapply(fields, function(x) input[[x]])
                       data
                     })
  # Save data
  saveData <- function(data) {
    x <- c(data$A, data$B)
    x <- ifelse(is.null(x), NA, x) # fill NAs if no selection made
    x <- data.frame("obj"=rep(data$obj, length(x)), "AB"=x)
    y <- c(data$C, data$D)
    y <- ifelse(is.null(y), NA, y)
    y <- data.frame("obj"=rep(data$obj, length(y)), "CD"=y)
    save(x,y, file="data.RData")
    }

  # Action to take when submit button is pressed
  observeEvent(input$submit, {saveData(formData())}
}

注意:如果不是在saveData()函数中构建data.frames,我只需保存聚合数据:

saveData <- function(data){save(data, file="test.RData")}

我得到一个带有四个对象A-D的RData文件,它由字符向量组成。然后,我可以按照我在saveData()函数中的方式构建data.frames,这是有道理的。但是,如果我使用初始saveData()函数运行应用程序,则data.frames不同,即使A和B中有多个选项,x也只包含一行。

我已经在网上搜索过了,我不能为我的生活找出正在发生的事情。

1 个答案:

答案 0 :(得分:0)

choices <- letters[1:4]

ui <- fluidPage(
       shinyjs::useShinyjs(),
       checkboxGroupInput("A", "A Variables:", choices),
       shinyjs::hidden(div(id="dB", checkboxGroupInput("B", "B Varaibles:", choices))),
                  checkboxGroupInput("C", "C Varaibles:", choices)  ,    
                  checkboxGroupInput("D", "D Varaibles:", choices),
                  actionButton("submit", "Submit", class = "btn-primary"),

       textOutput("txt")  #To check the output before it saved

)

server <- function(input, output, session) {
   # Hide/Unhide B
   observeEvent(input$A, ignoreNULL = F,
           {if("a" %in% input$A) {shinyjs::show("dB")
           } else {shinyjs::hide("dB")}
           })

   # Aggregate all form data
    fields <- c("A","B","C","D")
     formData <- reactive({

        data <- sapply(fields, function(x) input[[x]],simplify = F)
        data
})

 output$txt <- renderPrint({ formData() })

# Save data
  saveData <- function(data) {
#x <- cbind(data$A, data$B)
x <- data.frame(A = data$A,B=data$B)
#y <- cbind(data$C, data$D)
y <- data.frame(C=data$C, D=data$D )
save(x,y, file="data.RData")
 }

 # Action to take when submit button is pressed
 observeEvent(input$submit, {saveData(formData())})
}



shinyApp(ui, server)

经过一些修改,这是你的WE。但是,我不确定你的预期是否是输出。我希望它有所帮助。