【问题标题】:R Shiny aggregate data from renderUI checkboxGroupInputR Shiny 从 renderUI checkboxGroupInput 聚合数据
【发布时间】:2018-10-16 16:32:27
【问题描述】:

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

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

这是我的 MWE。

choices <- letters[1:4]

用户界面

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 也只包含一行。

我在网上搜索过,但我终生无法弄清楚发生了什么。

【问题讨论】:

    标签: r shiny shinyjs


    【解决方案1】:
    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。但是,我不确定这是否是您期望的输出。我希望它有所帮助。

    【讨论】:

    • UI 提供了一个数据输入框架,所以我不需要在那里呈现用户选择,只需将它们保存到一个 .RData 文件。我现在遇到的问题是由 A 和 B 组成的 data.frame x 仅包含 A 中的第一个选择,而 B 中没有任何内容。我认为 x &lt;- c(data$A, data$B) 会处理这个问题,但没有运气。所以,我想知道 div 包装器或其他东西是否正在改变聚合函数存储数据的方式。
    • 更新后的解决方案将保存 2 df 两列,但每个 df 中的列必须具有相同的长度。我记得我在某个地方读到,您可以创建具有不同列长度的 df,但我不记得在哪里。我会尝试检查。最后,如果您有多项选择题,最好尝试将它们保存为 0,1。
    • 在早期的迭代中,我确实使用了多个列,为了处理不同长度的列,我使用了解决方法cbind.fill。但是,我认为对于数据存储和以后的分析,简单地重复行会更容易。因此,rep() 函数 - 现在添加了 - 以及为什么我依赖 c()
    猜你喜欢
    • 1970-01-01
    • 2015-01-19
    • 2020-08-14
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 2020-09-29
    相关资源
    最近更新 更多