我有一个模块,在其中我根据反应值创建输入列表:如果此值为 3,则textInput
创建 3 s,等等。直到现在,当我需要从模块返回输入/值时,我列出了所有我的模块部分return()
末尾的输入/值(有关更多详细信息,请参阅本文)。server
但在这种情况下,由于输入的数量不是恒定的,我无法在return()
. 因此,我想创建一个可以返回的反应列表。
考虑下面的例子:
library(shiny)
some_things <- c("drat", "mpg", "cyl")
numtextinputs <- length(some_things)
some_UI <- function(id) {
ns <- NS(id)
tagList(
fluidRow(
column(
12,
lapply(1:numtextinputs, function(x) {
textInput(ns(some_things[x]),
label = some_things[x],
value = some_things[x])
}),
actionButton(ns("change"), "change inputs")
)
)
)
}
some_server <- function(input, output, session) {
observeEvent(input$change, {
test <- list()
char_numtextinputs <- as.character(numtextinputs)
for (x in char_numtextinputs) {
local({
test[[x]] <- input[[some_things[x]]]
})
}
return(reactive({ test }) )
})
}
ui <- fluidPage(
actionButton("create_ui", "create ui"),
uiOutput("ui"),
verbatimTextOutput("display_changes")
)
server <- function(input, output, session) {
observeEvent(input$create_ui, {
output$ui <- renderUI({
some_UI("1")
})
list_of_variables <- callModule(some_server, "1")
})
output$display_changes <- renderText({
if (exists("list_of_variables")){
list_of_variables$test()
}
else {
"list_of_variables$test does not exist"
}
})
}
shinyApp(ui, server)
在这个例子中,点击“create ui”会生成一个textInput
s 列表。请注意,这里textInput
创建的 s 数量是恒定的(我想举个简单的例子,在要创建的输入数量中添加一些反应性并不是很有用)。
预期结果:生成textInput
s 列表后,用户可以修改其中的值并在完成后单击“更改输入”。然后,模块应将textInput
s 中的值作为向量返回。verbatimTextOutput
只是在这里验证这些值是否被很好地返回。请注意,答案应该适用于任意数量的textInput
s (这就是我尝试列表和循环的原因)。