如何创建闪亮的文件列表?

时间:2017-11-09 07:18:09

标签: r list file server shiny

我在Shiny中调用R脚本。 R脚本有一个函数,它将文件列表作为参数。但是然后读取函数内的每个文件。这是示例

folder <- "~/Desktop/shiny" 
file_list <- list.files(path=folder, pattern="*.XLS") 


count_genes = function(file_list){
#Reading multiple files into a list of data frames, 
  my_data <- lapply(file_list, read.table)
.
.
.}

如何在闪亮中创建类似的(file_list)列表并从count_genes渲染结果。

代码应该1-选择目录中的多个文件。 2 - 对所选文件应用该功能,然后对表进行渲染。

这是我尝试过的。请原谅我的缩进

source('ReadFiles.R', local = TRUE)
library(shiny)

ui = navbarPage(HTML("Title"),
                tabPanel(HTML("<font size=3>Start</font>"),
                         sidebarPanel(width = 2,
                                      fileInput('files', 'UPLOAD', multiple = TRUE, accept = c('.XLS')),
                         mainPanel(
                           tabsetPanel(
                             tabPanel("StaVst",
                                      fluidRow(column(6,dataTableOutput("tabel1"))))                                       
))
server = function(input, output, session) {
  lst1 <- eventReactive(input$files, {
    req(input$Load!=0)
    lst <- list()
    for(i in 1:length(input$files[,1])){
      lst[[i]] <-  input$files[[i, 'datapath']]
    }
    count_genes(lst)
  })
   output$tabel1 <- renderDataTable({
     req(!is.null(input$files) & input$Load!=0)
     lst1()
   })
}

2 个答案:

答案 0 :(得分:3)

fileInput将有关所选文件的信息存储在数据框中。数据框有列'name','size','type'和'datapath'。这些文件在内部以随机路径名复制(例如“... AppData \ Local \ Temp \ RtmpMxmB1G / 48101199adb41c8ae7de0e78 / 3.txt”),可以使用input$files$datapath进行访问。

您可以直接使用:count_genes()将每个文件读入列表'tbl_list',或者只需要文件路径,而不是for循环和函数tbl_list <- lapply(input$files$datapath, read.table, header=TRUE, sep=";")。你的职能count_genes()

根据您的函数count_genes(),您的对象lst1()包含不同的内容,即函数count_genes()中返回的对象。使用问题中给出的函数count_genes()lst1()是一个列表对象,renderDataTable无法处理。要使用renderDataTable,首先需要将列表转换为函数count_genes()中的数据框。

这是一个可能有用的最小例子:

library(shiny)

# Define UI for data upload app ----
ui <- fluidPage(

  # App title ----
  titlePanel("Uploading Files"),

  # Sidebar layout with input and output definitions ----
  sidebarLayout(

    # Sidebar panel for inputs ----
    sidebarPanel(

      # Input: Select a file ----
      fileInput("files", "Upload", multiple = TRUE, accept = c(".xls"))
    ),

    # Main panel for displaying outputs ----
    mainPanel(
      # Output: Data file ----
      dataTableOutput("tbl_out")

    )

  )
)

# Define server logic to read selected file ----
server <- function(input, output) {
  lst1 <- reactive({
    validate(need(input$files != "", "select files..."))

    if (is.null(input$files)) {
      return(NULL)
    } else {

      path_list <- as.list(input$files$datapath)
      tbl_list <- lapply(input$files$datapath, read.table, header=TRUE, sep=";")

      df <- do.call(rbind, tbl_list)
      return(df)
    }
  })

  output$tbl_out <- renderDataTable({
    lst1()
  })

}

# Create Shiny app ----
shinyApp(ui, server)

答案 1 :(得分:-1)

我不知道以下解决方案是否可以接受,因为它使用的是VBA / Excel,而不是R,但无论如何你都可以考虑它。

Public fPath As String
Public IsSubFolder As Boolean
Public iRow As Long
Public FSO As Scripting.FileSystemObject
Public SourceFolder As Scripting.folder, SubFolder As Scripting.folder
Public FileItem As Scripting.File
Public IsFileTypeExists As Boolean



Public Sub ListFilesInFolder(SourceFolder As Scripting.folder, IncludeSubfolders As Boolean)


    On Error Resume Next
    For Each FileItem In SourceFolder.Files


' display file properties
        Cells(iRow, 2).Formula = iRow - 13
        Cells(iRow, 3).Formula = FileItem.Name
        Cells(iRow, 4).Formula = FileItem.Path
        Cells(iRow, 5).Formula = Int(FileItem.Size / 1024)
        Cells(iRow, 6).Formula = FileItem.Type
        Cells(iRow, 7).Formula = FileItem.DateLastModified
        Cells(iRow, 8).Select
        Selection.Hyperlinks.Add Anchor:=Selection, Address:= _
        FileItem.Path, TextToDisplay:="Click Here to Open"

'Cells(iRow, 8).Formula = "=HYPERLINK(""" & FileItem.Path & """,""" & "Click Here to Open" & """)"

        iRow = iRow + 1 ' next row number
        Next FileItem

        If IncludeSubfolders Then
            For Each SubFolder In SourceFolder.SubFolders
                ListFilesInFolder SubFolder, True
                Next SubFolder
            End If

            Set FileItem = Nothing
            Set SourceFolder = Nothing
            Set FSO = Nothing



        End Sub




        Public Sub ListFilesInFolderXtn(SourceFolder As Scripting.folder, IncludeSubfolders As Boolean)


            On Error Resume Next
            Dim FileArray As Variant

            FileArray = Get_File_Type_Array

            For Each FileItem In SourceFolder.Files

                Call ReturnFileType(FileItem.Type, FileArray)

                If IsFileTypeExists = True Then

                    Cells(iRow, 2).Formula = iRow - 13
                    Cells(iRow, 3).Formula = FileItem.Name
                    Cells(iRow, 4).Formula = FileItem.Path
                    Cells(iRow, 5).Formula = Int(FileItem.Size / 1024)
                    Cells(iRow, 6).Formula = FileItem.Type
                    Cells(iRow, 7).Formula = FileItem.DateLastModified

                    Cells(iRow, 8).Select
                    Selection.Hyperlinks.Add Anchor:=Selection, Address:= _
                    FileItem.Path, TextToDisplay:="Click Here to Open"

'Cells(iRow, 8).Formula = "=HYPERLINK(""" & FileItem.Path & """,""" & "Click Here to Open" & """)"

                    iRow = iRow + 1 ' next row number

                End If
                Next FileItem

                If IncludeSubfolders Then
                    For Each SubFolder In SourceFolder.SubFolders
                        ListFilesInFolderXtn SubFolder, True
                        Next SubFolder
                    End If

                    Set FileItem = Nothing
                    Set SourceFolder = Nothing
                    Set FSO = Nothing



                End Sub



                Sub ResultSorting(xlSortOrder As String, sKey1 As String, sKey2 As String, sKey3 As String)
                    Range("C13").Select
                    Range(Selection, Selection.End(xlDown)).Select
                    Range(Selection, Selection.End(xlToRight)).Select

                    Selection.Sort Key1:=Range(sKey1), Order1:=xlSortOrder, Key2:=Range(sKey2 _
                    ), Order2:=xlAscending, Key3:=Range(sKey3), Order3:=xlSortOrder, Header _
                    :=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom _
                    , DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption3:= _
                    xlSortNormal

                    Range("B14").Select
                End Sub


                Sub ClearResult()
                    If Range("B14") <> "" Then

                        Range("B14").Select
                        Range(Selection, Selection.End(xlDown)).Select
                        Range(Selection, Selection.End(xlToRight)).Select
                        Range(Selection.Address).ClearContents
                    End If
                End Sub


                Public Function Get_File_Type_Array() As Variant

                    Dim i, j, TotalSelected As Integer
                    Dim arrList() As String
                    TotalSelected = 0
                    For i = 0 To Sheet1.ListBoxFileTypes.ListCount - 1
                        If Sheet1.ListBoxFileTypes.Selected(i) = True Then
                            TotalSelected = TotalSelected + 1
                        End If
                    Next

                    ReDim arrList(0 To TotalSelected - 1) As String
                    j = 0
                    i = 0
                    For i = 0 To Sheet1.ListBoxFileTypes.ListCount - 1

                        If Sheet1.ListBoxFileTypes.Selected(i) = True Then
                            arrList(j) = Left(Sheet1.ListBoxFileTypes.List(i), InStr(1, Sheet1.ListBoxFileTypes.List(i), "(") - 1)
                            j = j + 1
                        End If

                    Next

                    Get_File_Type_Array = arrList

                End Function


                Public Function ReturnFileType(fileType As String, FileArray As Variant) As Boolean

                    Dim i As Integer

                    IsFileTypeExists = False

                    For i = 1 To UBound(FileArray) + 1

                        If FileArray(i - 1) = fileType Then

                            IsFileTypeExists = True
                            Exit For

                        Else
                            IsFileTypeExists = False
                        End If

                    Next

                End Function



                Sub textfile(iSeperator As String)

                    Dim iRow, iCol
                    Dim iLine, f




                    ThisWorkbook.Activate
                    Range("B13").Select
                    TotalRowNumber = Range(Selection, Selection.End(xlDown)).Count - 12

                    If iSeperator <> "vbTab" Then

                        Open ThisWorkbook.Path & "\File1.txt" For Output As #1
                        Print #1, ""
                        Close #1

                        Open ThisWorkbook.Path & "\File1.txt" For Append As #1
                        For iRow = 13 To TotalRowNumber

                            iLine = ""

                            For iCol = 2 To 7

                                iLine = iLine & iSeperator & Cells(iRow, iCol).Value
                            Next
                            Print #1, iLine
                        Next
                        Close #1


                    Else

                        Open ThisWorkbook.Path & "\File1.txt" For Output As #1
                        Print #1, ""
                        Close #1

                        Open ThisWorkbook.Path & "\File1.txt" For Append As #1
                        For iRow = 13 To TotalRowNumber

                            iLine = ""

                            For iCol = 2 To 7

                                iLine = iLine & vbTab & Cells(iRow, iCol).Value
                            Next
                            Print #1, iLine
                        Next
                        Close #1

                    End If



                    f = Shell("C:\WINDOWS\notepad.exe " & ThisWorkbook.Path & "\File1.txt", vbMaximizedFocus)

'MsgBox "Your File is saved" & ThisWorkbook.Path & "\File1.txt"

                End Sub





                Sub Export_to_excel()
                    On Error GoTo err



                    Dim xlApp As New Excel.Application
                    Dim xlWB As New Workbook

                    Set xlWB = xlApp.Workbooks.Add
'xlWB.Add
                    xlApp.Visible = False


                    ThisWorkbook.Activate
                    Range("B13").Select
                    Range(Selection, Selection.End(xlDown)).Select
                    Range(Selection, Selection.End(xlToRight)).Select

                    Selection.Copy

                    xlApp.Visible = True
                    xlWB.Activate
                    xlWB.Sheets("Sheet1").Select
                    xlWB.Sheets("Sheet1").Range("B2").PasteSpecial Paste:=xlPasteValues
                    xlWB.Sheets("Sheet1").Cells.Select
                    xlWB.Sheets("Sheet1").Cells.EntireColumn.AutoFit
                    xlWB.Sheets("Sheet1").Range("B2").Select
                    Exit Sub
err:
                    MsgBox ("Error Occured while exporting. Try again")

                End Sub

这个想法来自这里。

http://learnexcelmacro.com/wp/2011/11/how-to-get-list-of-all-files-in-a-folder-and-sub-folders/

您可以从网址下载示例文件。祝你好运。