如何使用shinyFileChoose创建反应性对象以加载data.frame

时间:2018-12-05 22:29:41

标签: r shiny shiny-reactivity

我一直在闪亮的应用程序中使用fileInput上传文件,然后创建一个反应性对象,该对象可以让我读取data.frame并进行其他操作,例如子设置或过滤。但是,我需要获取文件的绝对路径用于其他计算,并且看来fileUpload仅存储一个时间路径。

这是起作用的服务器部分

 server = function(input, output) {
 options(shiny.maxRequestSize=100*1024^2)

 contents <- reactive({
     inputFile <- input$fileUpload
     if (is.null(inputFile))
     return()
     read.delim(inputFile$datapath, header = TRUE)
 })

 # Return filename as another object
 file_name <- reactive({
      inFile <- input$fileUpload
      if (is.null(inFile))
      return()
      else {  print(inFile$name); return(tools::file_path_sans_ext(inFile$name))}
  })  

output$tabla <- DT::renderDataTable({
if(is.null(contents()))
  return()
  DT::datatable(contents(), 
              filter = 'top')
})

但是,我想使用shinyFiles选项,因为它存储了真实路径,并且我需要该路径来加载更多文件 我已经尝试在服务器中使用这部分代码来模仿与fileUpload相同的行为,但是它不起作用

server = function(input, output, session) {

volumes = getVolumes()
volumes <- c(Home = fs::path_home(), "R Installation" = R.home(), getVolumes()())

file_selected <- reactive({
   shinyFileChoose(input, "file", roots = volumes, session = session)
   return(parseFilePaths(volumes, input$file))
})

contents <- reactive({
  if (is.null(file_selected()))
  return()
  read.delim(file_selected(), header = TRUE)
})

# Reactive function creating the DT output object
 output$tabla <- DT::renderDataTable({
  if(is.null(contents()))
   return()
   DT::datatable(contents(), 
              filter = 'top')
 })

我收到关于file的错误,该错误必须是字符串或连接,如果我使用read.delim(as.character(file_selected()), header = TRUE),则该错误与无效的“描述”参数有关

1 个答案:

答案 0 :(得分:3)

有多种可能的错误原因。请尝试以下步骤:

  • 在解析文件路径之前使用req(input$file)
  • 在解析文件路径之前检查input$file是否为NULL
  • 返回$datapath函数的parseFilePaths

因此,您的代码应如下所示:

file_selected <- reactive({
   shinyFileChoose(input, "file", roots = volumes, session = session)
   req(input$file)
   if (is.null(input$file))
      return(NULL)    
   return(parseFilePaths(volumes, input$file)$datapath)
})

希望它对您有用。