У меня есть четыре checkboxGroupInput()
виджета, для простоты A-D. Прямо сейчас все четыре отображаются в пользовательском интерфейсе, но B скрыто с shinyjs::hidden()
. На сервере я динамически отображаю B в ответ на выбор в A.
Моя проблема связана с переносом выборок из A и B в один data.frame, а C и D в другой data.frame, когда пользователь нажимает кнопку отправки. Он делает что-то, чего я не понимаю, с выборами из A и B.
Вот мой MWE.
choices <- letters[1:4]
UI * * +1010
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())}
}
Примечание: если вместо построения data.frames в функции saveData()
я просто сохраню агрегированные данные:
saveData <- function(data){save(data, file="test.RData")}
Я получаю файл RData с четырьмя объектами A-D, которые состоят из векторов символов. Затем я могу построить там data.frames так, как я задумал в функции saveData()
, что имеет смысл. Но, если я запускаю приложение с начальной функцией saveData()
, data.frames будут другими, x содержит только одну строку, даже если в A и B. есть несколько вариантов выбора.
Я почесал паутину и не могу до конца жизни понять, что происходит.