在Shinyapp中选择要上传的Excel工作表

ycl3bljg  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(117)

我正在开发一个shinyapp,允许用户上传他们的数据。经常发生的情况是数据表没有存储在第一个位置,因此没有上传预期的表。
一种解决方法是指定预期的数据必须存储在第一个位置,但我想知道是否有一种方法可以从工作表中选择。我想这将是一个三步的过程:
1.以通常的方式上传excel文件,使用{readxl},例如

dat_raw <- reactive({ 

  req(input$file)

  readxl::read_excel(input$file$datapath)
   
 }
  
})

1.使用readxl::excel_sheets()存储工作表名称,并在下拉菜单中显示这些名称,可能使用observeupdateSelectInput,例如

observe({
  updateSelectInput(
   session = session,
   inputId = "sheetnames",
   choices = SHEETNAMES)
  )
 })

1.以某种方式使用选定的工作表名称来告诉应用程序然后读取哪些数据(可能需要另一次上传)或处理哪些数据(如果所有工作表都已存储在内存中)。
我已经广泛搜索,找不到其他地方提出的这个问题。我很感激你能提供的任何帮助

jtw3ybtb

jtw3ybtb1#

我想这样做。创建一个名为DatreactiveVal来存储上传的工作表。然后执行(sweetalert的内容来自shinyWidgets包):

observeEvent(input[["file"]], {
        xlfile <- input[["file"]][["datapath"]]
        ext <- tolower(file_ext(xlfile))
        if(ext == "xlsx") {
          sheets <- excel_sheets(xlfile)
          if(length(sheets) == 1L) {
            Dat(read_xlsx(input[["file"]][["datapath"]], sheet = 1L))
          } else {
            inputSweetAlert(
              session,
              inputId = "sheet",
              title = "Select the sheet",
              type = "question",
              input = "select",
              inputOptions = sheets
            )
          }
        } else {
          sendSweetAlert(
            session,
            title = "Wrong file",
            text = "Please upload a `xlsx` file.",
            type = "error"
          )
        }
      })

      observeEvent(input[["sheet"]], {
        Dat(read_xlsx(input[["file"]][["datapath"]], sheet = input[["sheet"]]))
      })

library(shiny)
library(shinyWidgets)
library(readxl)

ui <- fluidPage(
    sidebarLayout(
        sidebarPanel(
            fileInput("file", "Choose XLSX file")
        ),
        mainPanel(
            tableOutput("table")
        )
    )
)

server <- function(input, output, session) {

    Dat <- reactiveVal()

      observeEvent(input[["file"]], {
        xlfile <- input[["file"]][["datapath"]]
        ext <- tolower(tools::file_ext(xlfile))
        if(ext == "xlsx") {
          sheets <- excel_sheets(xlfile)
          if(length(sheets) == 1L) {
            Dat(read_xlsx(input[["file"]][["datapath"]], sheet = 1L))
          } else {
            inputSweetAlert(
              session,
              inputId = "sheet",
              title = "Select the sheet",
              type = "question",
              input = "select",
              inputOptions = sheets
            )
          }
        } else {
          sendSweetAlert(
            session,
            title = "Wrong file",
            text = "Please upload a `xlsx` file.",
            type = "error"
          )
        }
      })

      observeEvent(input[["sheet"]], {
        Dat(read_xlsx(input[["file"]][["datapath"]], sheet = input[["sheet"]]))
      })

    output[["table"]] <- renderTable({
        req(Dat())
        Dat()
    })

}

shinyApp(ui, server)

相关问题