如何在Shiny应用程序中将上传的文件转换为DataFrame

时间:2018-12-27 22:28:16

标签: r dataframe shiny

我正在关注Shiny网站上的File Upload Control教程。

Enter image description here

此代码允许加载CSV文件,并自动从上传的文件中呈现表格:

Enter image description here

问题是我无法将此表作为数据框访问以进行进一步处理。

1 个答案:

答案 0 :(得分:2)

只需设置一个反应块即可为您提供数据:

library(shiny)
ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      fileInput("file1", "Choose CSV File",
        accept = c(
          "text/csv",
          "text/comma-separated-values,text/plain",
          ".csv")
        ),
      tags$hr(),
      checkboxInput("header", "Header", TRUE)
    ),
    mainPanel(
      tableOutput("contents")
    )
  )
)

server <- function(input, output) {
  mydata <- reactive({
    # input$file1 will be NULL initially. After the user selects
    # and uploads a file, it will be a data frame with 'name',
    # 'size', 'type', and 'datapath' columns. The 'datapath'
    # column will contain the local filenames where the data can
    # be found.
    req(input$file1, input$header, file.exists(input$file1$datapath))
    read.csv(input$file1$datapath, header = input$header)
  })
  output$contents <- renderTable({
    req(mydata())
    mydata()
  })
}

shinyApp(ui, server)

现在您需要在其他任何地方使用新的data.frame,只需使用mydata()。 (我唯一的更改是将一些行移动到新的反应式块中,缩短renderTable块,并使用req(...)而不是笨拙的is.null方法。)


一些附加说明:

  • 通常在shiny应用中,对反应式块做好一件事情非常有用,例如“获取数据”,“绘图数据”,“适应/更改数据”。正是由于这个原因,我将原来的“读取文件然后呈现”的单个块分解为“读取文件”(向一个或多个使用者提供数据)并“呈现”的两个块。
  • 这需要与反应性平衡,这意味着依赖于其他块的块越多,我称之为应用程序组件“超抖动”的可能性就越大。例如,如果块“ B”依赖于“ A”,而块“ C”依赖于“ A”和“ B”,那么您可能会看到以下更新时间表:

    1. “ A”更新(由于某些原因)
    2. “ C”基于“ A”更新
    3. “ B”基于“ A”更新
    4. 基于“ B”的“ C”更新(即,一次更改有两次更新;这会产生用户可见的双更改,并且对于某些图,可能包括有限的时间延迟加倍) 。
  • 将两个项目符号结合起来:将“读取和渲染”分为“读取”和“渲染”似乎是合理的。如果您要处理数据(删除/添加列,过滤出行等),

    • 如果您永远不需要原始/原始数据,则此突变可能应该在“读取”阶段进行;
    • 如果您想与更改后的数据同时引用原始数据,则可能需要“读取”,“更新”和“渲染”阶段/代码块;
    • 即使您永远不需要引用原始数据,如果任何突变都依赖于用户定义的值(selectInputnumericInput等),那么您可能应该使用“ read” ,“更新”,“渲染”阶段,这样您就不必在用户每次更改其他字段之一时都重新读取数据