Return 来自模块的输入列表的值
Return the values of a list of inputs from a module
我有一个模块,我在其中根据反应值创建输入列表:如果此值为 3,则创建 3 textInput
s,等等。直到现在,当我需要 return inputs/values 来自模块,我在模块的 server
部分末尾列出了 return()
中的所有 inputs/values(参见 this article更多细节)。
但在这种情况下,由于输入的数量不是常数,我无法在 return()
中列出所有输入。因此,我想创建一个我可以 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
的列表。请注意,这里创建的 textInput
的数量是恒定的(我想举一个简单的例子,在要创建的输入数量中添加一些反应性不是很有用)。
预期结果:生成textInput
列表后,用户可以修改其中的值,当[=时点击"change inputs" 42=] 已经完成。然后模块应该 return textInput
中的值作为向量。 verbatimTextOutput
只是在这里验证值是否正确 returned。请注意,答案应该适用于任意数量的 textInput
s(这就是我尝试列表和循环的原因)。
更新:此应用程序将在 UI 模块中创建 3 个 textInput,并 return 使用服务器模块提取的 textInput 值向量并显示在 UI 中。这个原始示例中的一些内容已被略微修改或删除,以突出显示 return 从模块中创建的输入中获取值向量的答案。
library(shiny)
library(tidyverse)
some_things <- c("drat", "mpg", "cyl")
numtextinputs <- length(some_things)
some_UI <- function(id) {
ns <- NS(id)
tagList(
fluidRow(
column(
12,
map(some_things, ~textInput(ns(.x), label = .x, value = .x ))
)
)
)
}
some_server <- function(input, output, session) {
#extract values of all the text boxes without explicitly naming them
#by using the ids we used to create the textInputs
test <- reactive({
map_chr(some_things, ~input[[.x]])
})
#return the vector of values from module *note no () are needed after test
# i.e. return(test) NOT return(test())
return(test)
}
ui <- fluidPage(
some_UI("1"),
verbatimTextOutput("display_changes")
)
server <- function(input, output, session) {
list_of_variables <- callModule(some_server, "1")
output$display_changes <- renderText({
list_of_variables()
})
}
shinyApp(ui, server)
我有一个模块,我在其中根据反应值创建输入列表:如果此值为 3,则创建 3 textInput
s,等等。直到现在,当我需要 return inputs/values 来自模块,我在模块的 server
部分末尾列出了 return()
中的所有 inputs/values(参见 this article更多细节)。
但在这种情况下,由于输入的数量不是常数,我无法在 return()
中列出所有输入。因此,我想创建一个我可以 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
的列表。请注意,这里创建的 textInput
的数量是恒定的(我想举一个简单的例子,在要创建的输入数量中添加一些反应性不是很有用)。
预期结果:生成textInput
列表后,用户可以修改其中的值,当[=时点击"change inputs" 42=] 已经完成。然后模块应该 return textInput
中的值作为向量。 verbatimTextOutput
只是在这里验证值是否正确 returned。请注意,答案应该适用于任意数量的 textInput
s(这就是我尝试列表和循环的原因)。
更新:此应用程序将在 UI 模块中创建 3 个 textInput,并 return 使用服务器模块提取的 textInput 值向量并显示在 UI 中。这个原始示例中的一些内容已被略微修改或删除,以突出显示 return 从模块中创建的输入中获取值向量的答案。
library(shiny)
library(tidyverse)
some_things <- c("drat", "mpg", "cyl")
numtextinputs <- length(some_things)
some_UI <- function(id) {
ns <- NS(id)
tagList(
fluidRow(
column(
12,
map(some_things, ~textInput(ns(.x), label = .x, value = .x ))
)
)
)
}
some_server <- function(input, output, session) {
#extract values of all the text boxes without explicitly naming them
#by using the ids we used to create the textInputs
test <- reactive({
map_chr(some_things, ~input[[.x]])
})
#return the vector of values from module *note no () are needed after test
# i.e. return(test) NOT return(test())
return(test)
}
ui <- fluidPage(
some_UI("1"),
verbatimTextOutput("display_changes")
)
server <- function(input, output, session) {
list_of_variables <- callModule(some_server, "1")
output$display_changes <- renderText({
list_of_variables()
})
}
shinyApp(ui, server)