代码之家  ›  专栏  ›  技术社区  ›  socialscientist

R: 从Shiny中动态生成的输入字段生成动态图

  •  0
  • socialscientist  · 技术社区  · 2 年前

    我正在做一个 shiny 任意数量的 numericInput 任何时候都会动态生成字段 numericInput 页面加载时显示的字段将更新。然后,用户可以将值分配给这些字段,并按下按钮生成作为这些值的函数的绘图。

    在几个人的帮助下 posts ,我已经走了一段路。请参阅下面,我尝试让用户指定一些参数( n_params ),然后应该创建 numericInput 字段( param_fields )。由于这些字段中的值应显示在 input ,然后我尝试将用户提供的值提取到向量中,并用直方图对其进行汇总。

    让我困惑的是,当我运行应用程序时,为什么我收到一个错误,即参数“value”丢失,没有默认值,以及为什么绘图没有出现-似乎值没有保存在 输入 对象,但我不知道为什么。

    library(shiny)
    library(shinyWidgets)
    library(purrr)
    
    ui <- fluidPage(
      
      titlePanel("Title"),
      fluidRow(
        
        column("",
               width = 10, offset = 1,
               tags$h3("Filler"),
               
               panel(
                 numericInput("n_params","How many fields?", min = 2, max = 100, value = 3),
                 uiOutput("param_fields"),
                 numericInput("n_sims","How many simulations?", min = 0, max = 100000, value = 10000),
                 actionButton("sampling", "Sample from this distribution!")
               ),
               
               tags$h3("Plotted results!"),
               plotOutput("plotted")
      )
    )
    )
    
    # Define server logic 
    server <- function(input, output) {
      
      # Dynamically create a set of numeric input fields based on the
      # number of parameters specified (fancy math symbols needed, ignore mathjax)
      dynamic_list_of_numeric_fields <- reactive({
        n_params <- req(input$n_params)
        purrr::map(1:n_params,
                   ~numericInput(paste0("alpha",.), 
                                 withMathJax(paste0("\\(\\alpha_{", . ,"}\\)"))))
                              
      })
      
      # Render the parameter fields for user-input of values
      output$param_fields <- renderUI({
        div(
          req(dynamic_list_of_numeric_fields())
        )
      })
      
      # Create plot updated any time sampling button is pushed
      plots <- eventReactive(input$sampling, {
        
        # Get the user-input parameter values
        n_params <- req(input$n_params)
        param_ids <- paste0("alpha", 1:n_params)
        param_vals <- input[[param_ids]]
        
        # Histogram
        hist(param_vals)
      })
      
      output$plot <- renderPlot({
        plots()
      })
    }
    
    shinyApp(ui = ui, server = server)
    
    0 回复  |  直到 2 年前
        1
  •  0
  •   socialscientist    2 年前

    正如@guasi在评论中指出的那样,问题是 numericInput 缺少默认值。在提供这个值后,我也清楚地发现,当反应值只能由单个字符串索引时,我试图使用值的向量来索引它们。因此,我使用 purrr::map 对值的矢量进行运算。由于这会生成一个列表,因此我未列出以向 hist

    下面的修订代码生成了预期的直方图。

    library(shiny)
    library(shinyWidgets)
    library(purrr)
    
    ui <- fluidPage(
      
      titlePanel("Title"),
      fluidRow(
        
        column("",
               width = 10, offset = 1,
               tags$h3("Filler"),
               
               panel(
                 numericInput("n_params","How many fields?", min = 2, max = 100, value = 3),
                 uiOutput("param_fields"),
                 numericInput("n_sims","How many simulations?", min = 0, max = 100000, value = 10000),
                 actionButton("sampling", "Sample from this distribution!")
               ),
               
               tags$h3("Plotted results!"),
               plotOutput("plotted")
      )
    )
    )
    
    # Define server logic 
    server <- function(input, output) {
      
      # Dynamically create a set of numeric input fields based on the
      # number of parameters specified (fancy math symbols needed, ignore mathjax)
      dynamic_list_of_numeric_fields <- reactive({
        n_params <- req(input$n_params)
        purrr::map(1:n_params,
                   ~numericInput(paste0("alpha",.), 
                                 withMathJax(paste0("\\(\\alpha_{", . ,"}\\)"))))
                              
      })
      
      # Render the parameter fields for user-input of values
      output$param_fields <- renderUI({
        div(
          req(dynamic_list_of_numeric_fields())
        )
      })
      
      # Create plot updated any time sampling button is pushed
      plots <- eventReactive(input$sampling, {
        
        # Get the user-input parameter values
        n_params <- req(input$n_params)
        param_ids <- paste0("alpha", 1:n_params)
        param_vals <- input[[param_ids]]
        
        # Histogram
        hist(param_vals)
      })
      
      output$plot <- renderPlot({
        plots()
      })
    }
    
    shinyApp(ui = ui, server = server)
    
    推荐文章