shinyapp中的交互式文件输入和反应式读取

时间:2017-05-02 17:08:50

标签: r shiny reactive

我想制作一个shinyapp,它集成了选择文件(在选定的文件夹中)的功能(如在Interactive directory input in Shiny app (R)中),然后通过检测其中的变化来反应性地读取它,如{{ 3}}。

但是,我无法使reactiveFileReader函数与反应文件名(文件夹)一起工作。它似乎仅适用于一个预定义的文件名。

在这个应用程序中,文件应该在选择任何文件夹(按钮)后自动选择,前提是它在里面且具有相同的名称例如,如果您选择/ home / name /文件夹,则所选文件应为/home/name/folder/folder.csv。以下是不带代码的代码/ home / name / folder预期的功能。它显示了一个示例文件。

server<- function(input, output, session) { 
  shinyDirChoose(input, 'dir', roots = c(home = path1) )
  reacdir <- reactive(input$dir)
  output$dirtext <- renderPrint(c(path(),current() ) )
  path1<-"~"
  path <- reactive({
    home <- normalizePath(path1)
    file.path(home, paste(unlist(reacdir()$path[-1]), collapse = .Platform$file.sep))
  })

  current<-reactive({
    a<-sub('.*\\/', '', path() )  
    b<-paste("current subdir:",a)
  })

#  logfilename<- reactive({filename<-paste0(path(),"/",sub('.*\\/', '', path() ),".csv")})
   logfilename <- paste0('logfile',
                         floor(runif(1, 1e+05, 1e+06 - 1)),".txt")
  #    

  logwriter <- observe({
    invalidateLater(1000, session)
    cat(as.character(Sys.time()), '\n', file = logfilename,
        append = TRUE)
  })

  fileReaderData <- reactiveFileReader(500, session,
                                       logfilename, readLines)
 # when using logfilename(): You tried to do something that can only be done from inside a reactive expression or observer.

  # Also not working: fileReaderData <- reactive({file<-reactiveFileReader(500, session,
  #                                       logfilename(), readLines) })

  output$fileReaderText <- renderText({
    text <- fileReaderData()
    length(text) <- 14
    text[is.na(text)] <- ""
    paste(text, collapse = '\n')
  })
}
ui<-fluidPage(
  titlePanel("interactive selection of file and reactive reading"),
  fluidRow(
    column(12,
           shinyDirButton("dir", "1. Choose directory", "Upload")
           ,br(),br(),
            p("This app has a log file which is appended to",
             "every second.")
    )
  ),
  fluidRow(
    column(6, wellPanel(
      verbatimTextOutput("fileReaderText")
    ))
  )
)

shinyApp(ui, server)   

https://gist.github.com/wch/9652222

1 个答案:

答案 0 :(得分:2)

我来到这个解决方案。测试外部修改/folder/folder.csv文件。

library(shiny)
library(shinyFiles)
path1<-"~"
server<- function(input, output, session) { 
  shinyDirChoose(input, 'dir', roots = c(home = path1) )
  reacdir <- reactive(input$dir)
  output$dirtext <- renderPrint(c(path(),current() ) )

  path <- reactive({
    home <- normalizePath(path1)
    file.path(home, paste(unlist(reacdir()$path[-1]), collapse = .Platform$file.sep))
  })

  current<-reactive({
    a<-sub('.*\\/', '', path() )  
    b<-paste("current subdir:",a)
  })
  reac<-reactiveValues()
    observe({
        if(file.exists(paste0(path(),"/",sub('.*\\/', '', path() ),".csv")) ){
      fileReaderData<-reactiveFileReader(1000, session, paste0(path(),"/",sub('.*\\/', '', path() ),".csv"), read.csv, stringsAsFactors=FALSE)
      reac$df<-fileReaderData()
      output$fileReaderText <- renderText({
        text <- reac$df
        length(text) <- 14
        text[is.na(text)] <- ""
        paste(text, collapse = '\n')
    })
    }
    else{"index file does not exist, create with button 2."}
    }
  ) 
}
ui<-fluidPage(
  titlePanel("interactive selection of file and reactive reading"),
  fluidRow(
    column(12,
           shinyDirButton("dir", "1. Choose directory", "Upload")
           ,br(),br(),
           p("shinyapp")
    )
  ),
  fluidRow(
    column(6, wellPanel(
      verbatimTextOutput("fileReaderText")
    ))
  )
)

shinyApp(ui, server)