【发布时间】: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 也只包含一行。
我在网上搜索过,但我终生无法弄清楚发生了什么。
【问题讨论】: