2017-05-02 5 views
1

Ich möchte eine shinyapp machen, die die Funktionalität der Auswahl einer Datei (in einem ausgewählten Ordner) integriert, (wie in Interactive directory input in Shiny app (R)), und dann reaktiv lesen durch das Erkennen von Änderungen, wie in https://gist.github.com/wch/9652222.

Ich konnte jedoch die Funktion reactiveFileReader nicht mit einem reaktiven Dateinamen (Ordner) arbeiten lassen. Es scheint nur mit einem vorgegebenen Dateinamen zu funktionieren.

In dieser App wird erwartet, dass die Datei automatisch ausgewählt wird, nachdem ein beliebiger Ordner (Schaltfläche) ausgewählt wurde, vorausgesetzt, dass sie sich darin befindet und den gleichen Namen des Unterordners und der Erweiterung .csv hat.
Zum Beispiel, wenn Sie/home/Name/Ordner, die ausgewählte Datei sollte /home/name/folder/folder.csv sein
Unten ist ein Code ohne die erwartete Funktionalität. Es zeigt eine Beispieldatei.Interaktive Dateieingabe und reaktives Lesen in shinyapp

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) 

enter image description here

+0

Es ist nicht möglich, Änderungen an einer Datei auf der Client-Seite befindet sich zu überwachen: https://stackoverflow.com/questions/26107987/looking-for-a-way-for-a-website-to- Monitor-eine-Datei-auf-Client-Seite – HubertL

+0

siehe Antwort – Ferroao

+0

Ihre Antwort überwacht eine Datei auf dem Server - ich glaube, ich habe Ihre Frage missverstanden. Froh, dass du es herausgefunden hast, danke fürs Teilen. – HubertL

Antwort

1

kam ich zu dieser Lösung. Getestet, die Datei /folder/folder.csv extern zu ändern.

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)