为了简单起见,我有四个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也只包含一行。
我已经在网上搜索过了,我不能为我的生活找出正在发生的事情。
答案 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。但是,我不确定你的预期是否是输出。我希望它有所帮助。