我在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()
})
}
答案 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/
您可以从网址下载示例文件。祝你好运。