【问题标题】:Specifying data range from excel in Shiny在 Shiny 中从 excel 中指定数据范围
【发布时间】:2017-06-14 22:46:10
【问题描述】:

我想知道是否可以创建一个闪亮的应用程序,该应用程序允许您上传 Excel 文件并允许您根据工作表名称和单元格范围选择数据范围。 我想以此为基础,展示一些回归分析,但一直找不到起点。

【问题讨论】:

  • 首先查看包xlsx,它允许您读取/写入/操作 Excel 数据。 cran.r-project.org/web/packages/xlsx/xlsx.pdf
  • 你会发现这个博客 R-bloggersthis 是一个很好的起点
  • @ChiPak 感谢这似乎是唯一可以与闪亮一起使用的包,因为 readxl 会引发有关文件扩展名的错误(一个未解决的问题),并且 XLconnect 要求在使用 readWorksheet 之前先加载 excel。跨度>
  • @ParthChaudhary 感谢链接的示例看起来非常好

标签: r rstudio shiny


【解决方案1】:

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

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

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

不要忘记转换您的数据。请注意this example,您可能需要在其中考虑一些变量。

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

使用文件

一些可以帮助你的代码sn-ps。我已经将数据块作为 csv 文件提供。使用这些文件的列表设置一个 selectInput

# 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)

我在 selectInput 周围有一个反应,然后加载数据。 (我使用 data.tables 包 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
})

请注意验证,因为我的数据被绘制并且我想避免错误消息。请欣赏上面的关键设置和重命名列代码不是必需的,而是特定于我的示例,但它向您展示了您可以做些什么来让您的数据为用户“准备好”。

列出工作表名称

约翰这非常有用。看看谷歌群组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()
))

【讨论】:

  • 非常感谢您提供的信息和指南。事实证明,renderUI 非常有用
【解决方案2】:

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

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

http://readxl.tidyverse.org

【讨论】:

  • 欢迎安迪,最好在此处添加更多内容,而不仅仅是链接,以防将来链接中断。
  • 嗨,安迪,就像@micstr 所说,您可以通过从提供的链接中提取重要部分并将它们放入您的问题中来改进您的答案,这样可以确保您的答案仍然是链接获取的答案删除或更改
  • @AndyBarker 感谢您的回复,不幸的是 readxl 有一个闪亮的未解决问题,因此将查看 xlsx 包以使用。
猜你喜欢
  • 2023-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多