在Shiny中相互加载两个excel数据集

时间:2015-01-13 14:20:57

标签: r shiny

我尝试使用一个提交按钮在Shiny中加载两个excel数据集。

用户界面有一个侧边栏可以加载数据集和三个标签,以显示数据集和ggplot数字。

链接到第一个数据集时,我会选择一个工作表。接下来,我链接到第二个数据集。在我点击显示第二个数据集的用户界面中的第二个选项卡之前,我没有选择工作表。

然后我可以使用上传按钮,两个数据集显示在选项卡1和选项卡2中,而选项卡3显示数据集1的图表。

我的问题是,为什么在单击用户界面中的第二个标签之前,我无法看到第二个数据集的工作表选择菜单。

祝福

shinyUI(pageWithSidebar(
headerPanel("Claim Overview"),

sidebarPanel(
fileInput(inputId = "iFile", label = "Claims data", accept="application/vnd.ms-excel"),
tags$hr(),
uiOutput(outputId = "ui"),

fileInput(inputId = "iFileIndex", label = "Inflation data", accept="application/vnd.ms-excel"),
tags$hr(),
uiOutput(outputId = "uiIndex"),
submitButton("Upload!", icon("refresh"))
),

mainPanel(
tabsetPanel(
  tabPanel("Claim data", dataTableOutput(outputId = "contents")),
  tabPanel("Index data", dataTableOutput(outputId = "contentsIndex")),
  tabPanel("Claim plot", plotOutput(outputId = "ClaimPlot"))
))
))

shinyServer(function(input, output) {  

chooseFile <- reactive({
inFile <- input$iFile
if (!is.null(inFile)) {
    wb <- loadWorkbook(inFile$datapath)
    sheets <- getSheets(wb)
    output$ui <- renderUI({
      list(
        selectInput(inputId = "sheet", label = "Select a sheet:", choices = sheets),
        tags$hr()
      )
    })
    return(list(path = inFile$datapath))         
} else {return(NULL)}
})  

chooseIndexFile <- reactive({
inFile <- input$iFileIndex
if (!is.null(inFile)) {
    wb <- loadWorkbook(inFile$datapath)
    sheets <- getSheets(wb)
    output$uiIndex <- renderUI({
      list(
        selectInput(inputId = "sheet", label = "Select a sheet:", choices = sheets),
        tags$hr()
      )
    })
    return(list(path = inFile$datapath))
} else {return(NULL)}    
})  

output$contents <- renderDataTable({    
objFile <- chooseFile()    
if (!is.null(objFile)) {      
    Sheet <- input$sheet        
    if (!is.null(Sheet)){                              
        wb <- loadWorkbook(objFile$path)            
        dat <- readWorksheet(wb, Sheet)            
        return(dat)            
      }           
    } else {return(NULL)}              
})

output$contentsIndex <- renderDataTable({    
objFile <- chooseIndexFile()    
if (!is.null(objFile)) {      
    Sheet <- input$sheet        
    if (!is.null(Sheet)){                                 
        wb <- loadWorkbook(objFile$path)            
        dat <- readWorksheet(wb, Sheet)            
        return(dat)            
      }                              
    } else {return(NULL)}        
})

readClaimData <- function(){    
objFile <- chooseFile()    
if (!is.null(objFile)) {      
    Sheet <- input$sheet        
    if (!is.null(Sheet)){                              
        wb <- loadWorkbook(objFile$path)            
        dat <- readWorksheet(wb, Sheet)            
        return(dat)            
      }                              
    } else {return(NULL)}        
}

readIndexData <- function(){    
objFile <- chooseIndexFile()    
if (!is.null(objFile)) {      
    Sheet <- input$sheet        
    if (!is.null(Sheet)){                                  
        wb <- loadWorkbook(objFile$path)            
        dat <- readWorksheet(wb, Sheet)            
        return(dat)            
      }                              
    } else {return(NULL)}        
}

output$ClaimPlot <- renderPlot({
x    <- readClaimData()
ggplot(data = readClaimData(), aes(x=ClaimNo, y=Claim, fill = State)) + geom_bar(colour = "black", stat = "identity", position = position_dodge()) + facet_grid(Year ~ .)
})
})

1 个答案:

答案 0 :(得分:0)

我找到了一个非常简单的解决方案:

outputOptions(output, "contentsIndex", suspendWhenHidden=FALSE) 放在Server.R之后的output$contentsIndex。{/ p>

这会停止暂停Sheet选项,然后在加载第二个数据集后立即显示它。