【问题标题】:Dynamic input selection in shiny app闪亮应用中的动态输入选择
【发布时间】:2016-12-25 17:50:00
【问题描述】:

我制作了一个闪亮的应用程序,它有三个菜单:

  1. 数据:用于上传数据、选择变量和显示表格。
  2. 结果:只有在数据选项卡中按下继续按钮时才会显示。经过一些计算,结果将显示在此处。
  3. 绘图:从结果选项卡中的结果中选择一个变量并显示一些绘图。只有在“数据”选项卡中按下继续按钮时,才能选择变量。

我已成功完成菜单 1 和 2,但在选择“结果”选项卡中的变量形式结果时遇到了一些问题。

您可以从此链接http://en.osdn.jp/projects/sfnet_irisdss/downloads/IRIS.csv/ 获取虹膜数据进行上传。

这里是代码

library(shiny)
library(shinydashboard)
library(DT)
library(shiny)

ui <- dashboardPage(
  dashboardHeader(title = "Dashboard"),
  dashboardSidebar(sidebarMenu(
    menuItem("Data", tabName = "data", icon = icon("table")),
    menuItem("Results", tabName = "results", icon = icon("tasks")),
    menuItem("Plots", tabName = "plots", icon = icon("line-chart"))

  )),
  dashboardBody(
    tabItems(
      # First tab content
      tabItem(tabName = "data",
              fluidPage(
                fluidRow(
                  column(3,h3("Upload Your Data"),
                         fileInput('file1', 'Choose CSV File',
                                   accept=c('text/csv', 
                                            'text/comma-separated-values,text/plain', 
                                            '.csv')),
                         tags$hr(),
                         uiOutput('opts1')
                  ),

                  column(9,
                         uiOutput('box1')
                  )
                )
              )
      ),
      # Second tab content
      tabItem(tabName = "results",
              conditionalPanel("input.submit", 
                               fluidPage(box(title = "Results", solidHeader = TRUE, width = NULL, status = "primary",
                                             div(DT::dataTableOutput("showresults")))),
                                  tags$hr())

      ),
      # Third tab content
      tabItem(tabName = "plots",
              uiOutput('opts2')     
      )
    )
  )
)

服务器.R

shinyServer(function(input, output, session) {

  ## upload data

  theData <- reactive({
    infile <- input$file1        
    if(is.null(infile))
      return(NULL)        
    d <- read.csv(infile$datapath, header = T)
    d        
  })

  ## display data

  output$contents <- DT::renderDataTable({
    data1 <- theData()
    datatable(data1,
              options = list(searching = FALSE, filter = "top",
                             lengthMenu = list(c(10, 20, -1), c('10', '20', 'All')),
                             pageLength = 10)
    )
  })

  # dynamic box display
  output[["box1"]] <- renderUI({

    if(is.null(theData()))return()
    box(
      title = "Data", solidHeader = TRUE, width = NULL, status = "primary",
      div(style = 'overflow-x: scroll;', DT::dataTableOutput('contents'))
    )

  })

  ## dynamic input selection in Results tab
  output[["opts1"]] <- renderUI({

    if(is.null(theData())) return()
    fluidRow(selectInput('y', 'Y Variable', '---'),
             tags$hr(),
             actionButton("submit", "Proceed"))
  })

  # dynamic variable names
  observe({
    data<-theData()
    updateSelectInput(session, 'y', choices = names(data))
    #     updateSelectInput(session, 'yImp', yImp1)

  })

  resultOut <- eventReactive(input$submit,{
    var <-input$y
    data0 <- theData()
    yData <- data0[,match(var, colnames(data0))]
    data1 <- data0[,sapply(data0, is.numeric)]

    ## Some calculation
    dataOut <- colSums(data1*yData)
    dataOut <- dataOut[order(dataOut)]
    dataOut <- data.frame(Rank = 1:length(dataOut),
                             Variable = names(dataOut),
                             Sum = dataOut)
  })

  ## display result in result tab
  output$showresults <- DT::renderDataTable({
    dispRes <- resultOut()
    datatable(dispRes, rownames = F,
              options = list(lengthMenu = list(c(10, 20, -1), c('10', '20', 'All')),
                             pageLength = 10))
  })

  ## take input of variable in result Out in tab Plots

  output[["opts2"]] <- renderUI({

    if(!input$submit) return()
    fluidRow(selectInput('yOut', 'Y Variable', '---'),
             tags$hr(),
             actionButton("submit", "Proceed"))
  })

  # dynamic variable names
  observe({
    dataOut<-resultOut()
    yList <- dataOut$Variable
    updateSelectInput(session, 'yOut', choices = yList)
    #     updateSelectInput(session, 'yImp', yImp1)

  })

})

【问题讨论】:

    标签: r shiny shinydashboard


    【解决方案1】:

    观察事件似乎没有对 resultOut 变量做出反应,或者它在呈现选择输入之前运行。有趣的问题。我想出的唯一解决方案是在输出[[“opts2”]]中呈现完整的selectInput(包括选项)。这是代码:

    output[["opts2"]] <- renderUI({
    
                if(is.null(resultOut)) return()
                dataOut <- resultOut()
                yList <- dataOut$Variable
                fluidRow(selectInput('yOut', 'Y Variable', choices = yList),
                         tags$hr(),
                         actionButton("submit1", "Proceed")
                )
        })
    

    and of 移除最后一个观察者。

    这个讨论可能与此有关。 R shiny Observe running Before loading of UI and this causes Null parameters

    【讨论】:

    • 确实很奇怪。正如 Valter 已经指出的那样,这很可能是因为观察者在创建小部件之前运行,而他的解决方案 - 在 renderUI 中定义选择 - 是可行的。另一种解决方案是再次使用conditionalPanel 而不是renderUI。小部件从一开始就存在,更新它不会有任何问题。
    猜你喜欢
    • 2016-11-21
    • 2014-10-25
    • 2019-06-14
    • 2020-07-04
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多