根据上传的数据集的变量创建多个数字输入

时间:2018-08-08 11:09:12

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

我正在开发一个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)

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

Screenshot of the app

1 个答案:

答案 0 :(得分:0)

您可以使用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