闪亮的应用程序:如何收集所有的文本输入到一个数据框中,而不单独列出它们(如何索引React值?)

siv3szwd  于 2023-01-10  发布在  React
关注(0)|答案(1)|浏览(69)

我在应用程序的一个选项卡中显示了一组基于三列数据框的文本输入,其中包含:variable_name、text_prompt和example_data。下面的代码看起来工作得很好,因为它显示了我希望它如何工作。最终,我将根据情况为它提供不同的 Dataframe ,所以我需要能够以编程方式完成所有事情。

library(shiny)
library(tidyverse)
library(DT)

additional.data.fields <- tibble (var.name = c("project.id", "director.name"), 
                                  prompt.text = c("Enter Project ID", "Enter Director's name"),
                                  var.value = c("e.g. 09-111", "e.g. Paul Smith"))

ui <- fluidPage(
    tabsetPanel(
        #Generate Input fields from dataframe
        tabPanel("Input", #value = "input.2",
                 # Generate input fields with pmap
                 actionButton("submit", "Submit"),
                 pmap(additional.data.fields, ~textInput(..1, ..2, value = ..3)),
        ),
        #Output data to tell if it updates with button click
        tabPanel("Output", value = "output",
                 DT::dataTableOutput("data")
        )
    )
)

server <- function(input, output, session) {
    # Create a reactive values object to store the input data
    values <- reactiveValues()
    
    # Set the reactive values object when the submit button is clicked
    observeEvent(input$submit, {
        var.names <- pull(additional.data.fields, var.name)
        #THIS IS THE PART I DON'T KNOW HOW TO DO
        #input.data <- ???
        #I'll add dummy data so that the program loads
        input.data <- tibble(var.names, 
                            temp = 1:length(var.names))
        values$data <- input.data
    })
    
    # Render the input data table
    output$data <- DT::renderDataTable({
        values$data
    })
}

shinyApp(ui, server)

但我想要的--而且真的不知道该怎么做--是在用户点击“提交”后让它回到一个数据框中(我只需要在随后的数据框中有两列;我不再需要text_prompt数据。)
我知道用户输入创建了一个名为“input”的只读ReactiveValues列表,但是除了使用已知名称进行访问之外,我不知道如何使用该列表执行其他操作(我知道有一个名为“project_id”的变量,我可以使用input$project_id访问它)。但我想要的不是必须把它们都写出来,这样我就可以改变用于创建输入字段的数据。所以我需要一种方法来将它们收集到一个数据框中,而不需要知道所有变量的单独名称,甚至不需要知道有多少变量。

nfeuvbwi

nfeuvbwi1#

这是我自己想出来的。你不能用[]来索引无功值。但是,出于某种原因,你可以用
我很想知道这是为什么,如果有人有一个答案,可以帮助我理解为什么它这样工作。
下面是我之前遗漏的关键代码:

input.data <- tibble (names = var.names,
                      values = map_chr(var.names, ~input[[.x]]))

完整的代码,工作,因为我想要它粘贴在下面。我仍然感谢任何反馈或改进建议。

library(shiny)
library(tidyverse)
library(DT)

additional.data.fields <- tibble (var.name = c("project.id", "director.name"), 
                                  prompt.text = c("Enter Project ID", "Enter Director's name"),
                                  var.value = c("e.g. 09-111", "e.g. Paul Smith"))

ui <- fluidPage(
    tabsetPanel(
        #Generate Input fields from dataframe
        tabPanel("Input", #value = "input.2",
                 # Generate input fields with pmap
                 actionButton("submit", "Submit"),
                 pmap(additional.data.fields, ~textInput(..1, ..2, value = ..3)),
        ),
        #Output data to tell if it updates with button click
        tabPanel("Output", value = "output",
                 DT::dataTableOutput("data")
        )
    )
)

server <- function(input, output, session) {
    # Create a reactive values object to store the input data
    values <- reactiveValues()
    
    # Set the reactive values object when the submit button is clicked
    observeEvent(input$submit, {
        var.names <- pull(additional.data.fields, var.name)
        input.data <- tibble (names = var.names,
                              values = map_chr(var.names, ~input[[.x]]))
        values$data <- input.data
    })
    
    # Render the input data table
    output$data <- DT::renderDataTable({
        values$data
    })
}

shinyApp(ui, server)

相关问题