首页 > 解决方案 > 如何以编程方式从许多 Shiny 输入中生成 data.frame?

问题描述

我正在尝试创建一个具有约 100 个用户输入的 Shiny 应用程序,其中一些可能不会被触及。我认为我可以通过编写 , 等 100 次来在应用程序中创建一个反应性数据框input$user_input_1input$user_input_2以单独调用每个输入。相反,我想知道是否有一种方法可以使用连接函数以编程方式生成输入列表,然后像我输入了一样评估这些输入input$user_input_1。但是,当我运行以下代码时,我收到一条消息,告诉我Error: object 'input' not found.

我的最终目标是能够接受这些用户输入并在一些幕后转换中使用它们。如果我当前的设置不是捕获大量输入的最有效方式,请告诉我,但至少我想了解什么在这里不起作用。

我很感激这里的一些帮助。谢谢。

library(shiny)
library(tidyverse)

input_tbl <- tibble(inputs = c("x", "y", "z"))

ui <- fluidPage(

    sidebarLayout(
        sidebarPanel(
            numericInput(
                inputId = "number_x",
                label   = "Input X",
                value   = 30
            ),
            numericInput(
                inputId = "number_y",
                label   = "Input Y",
                value   = 60
            ),
            numericInput(
                inputId = "number_z",
                label   = "Input Z",
                value   = 90
            )
        ),

        mainPanel(
           verbatimTextOutput("table")
        )
    )
)

server <- function(input, output) {

    value_tbl <- eventReactive(
        eventExpr = input$number_x,
        valueExpr = {

            tibble(
              inputs = input_tbl %>% pull(),
              values = input_tbl %>%
                  pull() %>%
                  modify(~ str_c("input$number_", .x)) %>%
                  map(~ parse(text = .x)) %>%
                  map(eval)
            )

        })

    output$table <- renderPrint(value_tbl())
}

shinyApp(ui = ui, server = server)

标签: rshiny

解决方案


如果我说得对,您可以使用purrr::map_df如下代码实现您想要的结果:

server <- function(input, output) {
  
  value_tbl <- eventReactive(
    eventExpr = input$number_x,
    valueExpr = {
      map_df(input_tbl$inputs, ~ data.frame(inputs = .x, values = input[[paste0("number_", .x)]]))
    })
  
  output$table <- renderPrint(value_tbl())
}

在此处输入图像描述


推荐阅读