【问题标题】:Creating multiple numeric input according to the variables of an uploaded dataset根据上传数据集的变量创建多个数字输入
【发布时间】:2019-01-15 15:07:52
【问题描述】:

我正在开发一款 Shiny 应用程序,该应用程序允许用户上传自己的数据并进行分析。在某一点上,我想允许用户引入新数据作为数字输入并构建一个包含它们的新表。
我希望我的应用程序能够动态执行此操作,即在侧边栏面板中创建一个框,其中包含相应的新数字输入以及我上传的数据集的变量名称。
我可以通过指示先验特定变量来做到这一点,但我想让它动态化。
如果有人能处理这件事,我会非常高兴。 这里包含了我的代码的简单示例和显示其外观的屏幕截图(但带有 先验 指定的变量)。

library(shiny)
ui <- fluidPage(
  tabPanel("New Cases", icon=icon("edit"),
           sidebarLayout(
            sidebarPanel(width=3, #sidebarPanel "New Cases"
                        conditionalPanel(
                            'input.dataset02 === "Edit Table"',
                            textInput('NewID', HTML('<h5><b>Enter Name</b></h5>')), #Enter Factor?
                            numericInput('NewVal1', HTML('<h5><b>Enter Item</b></h5>'), NULL),
                            br(),
                            fluidRow(
                              column(2,  HTML('<h5><b>E14</b></h5>')),
                              column(4, numericInput("NewVal3", label = NULL, value = NULL)),
                              column(2, HTML('<h5><b>E16</b></h5>')), 
                              column(4, numericInput("NewVal4", label = NULL, value = NULL))
                            ),
                            fluidRow(
                              column(2, HTML('<h5><b>E18_1</b></h5>')),
                              column(4, numericInput("NewVal5", label = NULL, value = NULL)),
                              column(2,  HTML('<h5><b>E18</b></h5>')), 
                              column(4, numericInput("NewVal6", label = NULL, value = NULL))
                            ),
                            fluidRow(
                              column(2, HTML('<h5><b>FAEE</b></h5>')),
                              column(4, numericInput("NewVal7", label = NULL, value = NULL)),
                              column(2,  HTML('<h5><b>EtG</b></h5>')), 
                              column(4, numericInput("NewVal8", label = NULL, value = NULL))
                            ),
                            br(),
                            actionButton("goButton", "Update Table",icon("cloud-upload"), 
                                         style="width: 100%; height: 60px; color: steelblue; background-color: #337ab7; border-color: #2e6da4"),
                            br()
                          )),
             mainPanel(
               tabsetPanel(
                 id = 'dataset02',
                 tabPanel("Edit Table",
                          br(),
                          dataTableOutput("table3"))
                 ))
           )))
server <- function(input, output) {
  mydata3 = data.frame(Name=letters[NULL], Item=sample(NULL),Piece=sample(NULL), E14=sample(NULL), E16=sample(NULL), 
                       E18_1=sample(NULL), E18=sample(NULL), FAEE=sample(NULL), ETG=sample(NULL))
  output$table3 <- renderDataTable( df3())
  df3 <- eventReactive(input$goButton, {
    if(input$NewID!=" " && !is.null(input$NewVal1)
       && !is.null(input$NewVal3) && !is.null(input$NewVal4) && !is.null(input$NewVal5) 
       && !is.null(input$NewVal6) && !is.null(input$NewVal7) && !is.null(input$NewVal8) 
       && input$goButton>0)
      {
      newrow = data.frame(
        Name = input$NewID,
        Item = input$NewVal1,           
        Piece = 1,                      
        E14 = input$NewVal3,
        E16 = input$NewVal4,
        E18_1 = input$NewVal5,
        E18 = input$NewVal6,
        FAEE = input$NewVal7,
        ETG = input$NewVal8)
      mydata3 <<- rbind(mydata3, newrow)
    }
    mydata3
  }, ignoreNULL = FALSE)
}
shinyApp(ui = ui, server = server)

应用程序的屏幕截图(“所需”格式)如下:

【问题讨论】:

    标签: file-upload dynamic shiny insert-update numeric-input


    【解决方案1】:

    您可以使用renderUIuiOutput 动态创建输入。

    例子:

    # LIBRARIES & SOURCING --------------
    library(shiny)
    library(shinydashboard)
    
    # UI -----------------
    ui <- dashboardPage(title="App Title", 
                        dashboardHeader(disable = TRUE),
                        dashboardSidebar(disable = TRUE),
                        dashboardBody( 
                            fluidRow(
                                uiOutput("uiOut1")
                            )
    ))
    
    # SERVER -----------------
    server <- function(input, output) {
    
        output$uiOut1 = renderUI(
            list(
                numericInput("dynInput1", "First dynamic input:", 20, 0, 40),
                numericInput("dynInput2", "Second dynamic input:", 20, 0, 40)
            )
        )
    }
    
    shinyApp(ui = ui, server = server)
    

    如果您需要使用变量来选择您想要的输入,您可以使用input$dynInput1input[["dynInput1"]] 引用输入。

    更多信息在这里:https://shiny.rstudio.com/articles/dynamic-ui.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-15
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      • 1970-01-01
      • 1970-01-01
      • 2019-04-12
      • 2019-07-01
      相关资源
      最近更新 更多