1

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

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

应用截图

4

1 回答 1

0

renderUI您可以使用和动态创建输入uiOutput

例子:

# 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$dynInput1然后,您可以使用或input[["dynInput1"]]如果需要使用变量来选择所需的输入,则可以参考输入。

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

于 2018-08-08T16:40:33.820 回答