2017-06-08 148 views
0

我用shinyDirChoose保存了用戶定義文件夾的路徑。現在我想從該用戶的文件夾上傳文件,但我無法弄清楚如何去做。 1)所有在服務器端? 2)以某種方式將文件路徑送入fileInputr shiny - 將shinyDirChoose文件夾中的所有文件上傳到服務器

這是我如何構建應該上傳的三個文件的文件路徑。

### ui end, to browse to desired folder 
ui = fluidPage(shinyDirButton('directory', 'Folder select', 'Please select a folder')) 

### extracting the folder path 
server = function(input, output, session) { 
    volumes <- getVolumes() 
    shinyDirChoose(input, 'directory', roots=volumes, session=session) 
    path1 <- reactive({ 
     return(print(parseDirPath(volumes, input$directory))) 
    }) 

### constructing the 3 file paths 
datpat <- renderText({ 
    req(nchar(path1())>0) 
    datpat <- paste0(path1(),"/data.csv") 
    }) 
vispat <- renderText({ 
    req(nchar(path1())>0) 
    vispat <- paste0(path1(),"/visit.csv") 
    }) 
statpat <- renderText({ 
    req(nchar(path1())>0) 
    statpat <- paste0(path1(),"/statvisit.csv") 
}) 

所以現在我有這些路徑,但是我怎樣才能使用它們將相關內容上傳到服務器?不幸的是,一個簡單的read.csv沒有辦法。

編輯 - 但現在還沒有...

與提供很大的幫助@SBista進一步的工作,我想我接近我的目標,但看到下面的代碼...

volumes <- getVolumes() 
shinyDirChoose(input, 'directory', roots=volumes, session=session) 
path1 <- reactive({ 
    return(print(parseDirPath(volumes, input$directory))) 
}) 

observe({ 
    if(!is.null(path1)){ 
    ### vis1 
    vis1 <- reactive({ 
     datpat <- paste0(path1(),"/visit.csv") 
     vis <- read.csv(datpat, header = input$header, sep = input$sep, quote = input$quote, 
         stringsAsFactors = FALSE) 
     vis 
    }) 
    ### dataruw1 
    dataruw1 <- reactive({ 
     datpat <- paste0(path1(),"/data.csv") 
     dataruw <- read.csv(datpat, header = input$header, sep = input$sep, quote = input$quote, 
          stringsAsFactors = FALSE) 
     dataruw 
    }) 
    } 
}) 

不幸的是,dataruw1vis1似乎沒有生成,因爲當我嘗試使用dataruw1()vis1()的實際數據時,出現'找不到函數'錯誤。我錯過了什麼?任何想法?提前感謝!

+0

嘗試在服務器函數啓動時聲明'reactiveValue'並在讀取它時分配值。編輯代碼的問題在於''反應表達式'的範圍在'if'條件內是有限的。 – SBista

+0

是否已將此「將shinyDirChoose文件夾中的所有文件上載到服務器」處理? – RanonKahn

+0

@RanonKahn我只能說下面的答案(或者說是第二個答案中的評論)符合我的需求...... –

回答

1

很高興找到解決方案!非常感謝SBista,儘管我做了一點改變。下面的代碼不僅僅是一個塊(如我原來的文章),而是功能完備,只要您瀏覽到一個文件夾,該文件夾包含一個文件夾即文件。

library(shiny) 
library(shinyFiles) 
library(htmltools) 


############################################################################## 

ui = navbarPage(
    HTML("Title"), 
    tabPanel(HTML("<font size=3>Start</font>"), 
      sidebarPanel(width = 2, 
         shinyDirButton('directory', 'Folder select', 'Please select a folder'), 
         checkboxInput('header', 'Header', TRUE), 
         radioButtons('sep', 'Separator', c(Comma=',',Semicolon=';',Tab='\t'), selected=';'), 
         radioButtons('quote', 'Quote', c(None='','Double Quote'='"','Single Quote'="'"), selected='"')), 
      mainPanel(
      fluidRow(
       column(6, tags$b(textOutput("text")))), 
      tags$hr(), 
      fluidRow(
       column(6, dataTableOutput("table")) 
      ) 
      ) 
) 
) 

server = function(input, output, session) { 

    volumes <- getVolumes() 
    shinyDirChoose(input, 'directory', roots=volumes, session=session) 
    path1 <- reactive({ 
    return(print(parseDirPath(volumes, input$directory))) 
    }) 

    dataruw1 <- eventReactive(input$directory, { 
    datpat <- paste0(path1(),"/data.csv") 
    dataruw <- read.csv(datpat, header = input$header, sep = input$sep, quote = input$quote, 
         stringsAsFactors = FALSE) 
    dataruw 
    }) 

    output$text <- renderText({ 
    path1() 
    }) 

    output$table <- renderDataTable({ 
    dataruw1() 
    }) 

} 

shinyApp(ui = ui, server = server, options = list(launch.browser=TRUE)) 
0

我修改了您的應用程序以證明您可以使用read.csv上傳文件。爲了演示,我只讀取文件夾中的一個文件,並在數據表中顯示讀取的數據幀。

library(shiny) 
    library(shinyFiles) 

    ### ui end, to browse to desired folder 
    ui = fluidPage(shinyDirButton('directory', 'Folder select', 'Please select a folder'), 
       tableOutput(outputId = "datpat") 
       ) 

    ### extracting the folder path 
    server = function(input, output, session) { 
    volumes <- getVolumes() 
    shinyDirChoose(input, 'directory', roots=volumes, session=session) 
    path1 <- reactive({ 
     return(print(parseDirPath(volumes, input$directory))) 
    }) 

    ### constructing the 3 file paths 
    observe({ 
     if(!is.null(path1)){ 
     output$datpat <- renderTable({ 
      req(nchar(path1())>0) 
      datpat <- paste0(path1(),"/data.csv") 
      dat <- read.csv(datpat) 
      dat 
     }) 

     } 
    }) 

    } 

    shinyApp(ui = ui, server = server) 

希望它有幫助!

+0

非常感謝!這是我的第一個問題,所以能夠得到如此迅速的答案真是太好了。我編輯了我的OP,以顯示出我的代碼是什麼,但它還沒有工作(請參閱編輯後)... –

+0

解決方案添加爲答案。不幸的是不能在服務器上工作,只能在本地。 –

+0

'shinyFiles'只能在本地使用。您可以在服務器上檢查[this](https://stackoverflow.com/questions/39196743/interactive-directory-input-in-shiny-app-r)鏈接以進行目錄選擇。 – SBista

相關問題