2017-06-08 108 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

相关问题