Return 来自模块的输入列表的值

Return the values of a list of inputs from a module

我有一个模块,我在其中根据反应值创建输入列表:如果此值为 3,则创建 3 textInputs,等等。直到现在,当我需要 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。请注意,答案应该适用于任意数量的 textInputs(这就是我尝试列表和循环的原因)。

也问了on Rstudio Community

更新:此应用程序将在 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)