在 Shiny 中指定从 excel 开始的数据范围

Specifying data range from excel in Shiny

我想知道是否可以创建一个闪亮的应用程序,它允许您上传 excel 文件并允许您 select 基于 sheet 的数据范围名称和单元格范围。 我想以此为基础展示一些回归分析,但未能找到起点。

John,当遇到此类问题时,看看 Shiny 画廊并查看 Stack Overflow 上过去的答案以获取代码示例总是一个好主意。

这里有一个数据上传的示例教程。这可以是 CSV 而不仅仅是 xls。 https://shiny.rstudio.com/gallery/file-upload.html。但代码布局可能对您设置输入有用。

保持简单?您可以将您想要的数据范围保存为 csv 文件,这样您的用户就不必指定数据范围,sheet .我这样做是为了让用户只需要在 select 框中查看他们想要的数据集,而不用去寻找数据。请参见下面的示例。 (这可能会为您节省大量错误捕获代码)。

不要忘记转换您的数据。注意 您可能需要考虑一些变量的地方。

如上文 Parth 所述,请参阅 https://www.r-bloggers.com/read-excel-files-from-r/ 了解有关包 Xl_Connectxlsx 的更多详细信息。您可以指定 sheets。

使用文件

一些可能对您有所帮助的代码片段。我的数据块已作为 csv 文件提供。使用这些文件的列表设置 select 输入

# in ui.R
selectInput(("d1"), "Data:", choices = data.choices)

我用这个代码在global.R中填写data.choices

# filter on .csv
data.files <- list.files(path = "data", pattern = ".csv") 

# dataset choices (later perhaps break by date)
#  sort by date most recent so selectInput takes first one
data.choices <- sort(data.files, decreasing = TRUE)

我在 select 输入周围有一个反应,然后加载数据。 (我使用 data.tables package fread 所以你需要安装这个包并使用 library(data.tables) 如果你使用这个代码)。

dataset1 <- reactive({

  validate(
    need(input$d1 != "", "Please select a data set")
  )

  if (!is.null(input$d1)) {

    k.filename <- input$d1 # e.g. 'screendata20160405.csv'
    isolate({
      ## part of code this reactive should NOT take dependency on

      # LOAD CSV
      s.dt <- fread(file.path("data", k.filename), 
                    na.strings = c("NA", "#N/A")) %>% 
        rename(ticker = Ticker)

      # You might choose to rather dot.the.column.names to save DT issues
      #setnames(DT, make.names(colnames(DT))) 

      # SET KEYS IF RELEVANT
      k.id.cols <- c("ticker") 
      if ("date" %in% names(s.dt)) {
        k.id.cols <- c(k.id.cols, "date")
      }
      setkeyv(s.dt, k.id.cols)

      # NAME CHANGES rename columns if necessary
      setnames(s.dt, "Short Name", "name")

   })
  } else {
    s.dt <- NULL #input$d1 is null
  }
  s.dt
})

注意在绘制我的数据时进行验证,我想避免出现错误消息。请理解上面的键设置和重命名列代码不是必需的,但特定于我的示例,但向您展示了如何为用户获取数据 "ready"。

获取 SHEET 名字

约翰,这很有用。看看 google 组 https://groups.google.com/forum/#!topic/shiny-discuss/Mj2KFfECBhU

上的这个长线程

Huidong Tian 在 2014 年 3 月 17 日获得了这段非常有用的代码(但也请参阅 Stephane Laurent 关于关闭 XLConnect 以管理内存的代码):

library(XLConnect)

shinyServer(function(input, output) { 
  Dat <- reactiveValues()
  observe({
    if (!is.null(input$iFile)) {
      inFile <- input$iFile
      wb <- loadWorkbook(inFile$datapath)
      sheets <- getSheets(wb)
      Dat$wb <- wb
      Dat$sheets <- sheets
    }
  })

  output$ui <- renderUI({
    if (!is.null(Dat$sheets)) {
      selectInput(inputId = "sheet", label = "Select a sheet:", choices = Dat$sheets)
    }
  })

  observe({
    if (!is.null(Dat$wb)) {
      if (!is.null(input$sheet)){
        dat <- readWorksheet(Dat$wb, input$sheet)
        print(names(dat))
        output$columns <- renderUI({
          checkboxGroupInput("columns", "Choose columns", 
                             choices  = names(dat))
        })
      }
    }
  })
})



shinyUI(pageWithSidebar(
  # Include css file;
  tagList(
    tags$head(
      tags$title("Upload Data"),
      tags$h1("Test")
    )
  ),

  # Control panel;
  sidebarPanel(
    fileInput(inputId = "iFile", label = "Escolha um arquivo:", accept="application/vnd.ms-excel"),
    radioButtons("model", "Escolha do Modelo:",
                 list("CRS" = "crs",
                      "VRS" = "vrs")),
    br(),
    tags$hr(),
    uiOutput(outputId = "ui"),
    uiOutput(outputId = "columns")
  ),
  # Output panel;

mainPanel()
))

您可以包括文件路径和单元格范围的输入,并使用闪亮的操作按钮将输入变量发送到 read_excel()

https://shiny.rstudio.com/articles/action-buttons.html

http://readxl.tidyverse.org