2017-05-29 3 views
0

Entschuldigung, ich bin neu für Shiny. Ich habe kürzlich versucht, das reaktive Programm zu verwenden, um ein Projekt zu beenden. Aber jetzt habe ich ein Problem, das nicht in der Lage ist herauszufinden, warum das passiert.reaktiver Ausdruck Ergebnis unterschiedlich

Zuerst erstelle ich einen reaktiven Ausdruck, der alle Dateien in einem Ordner auflistet.

fullFilenames <- reactive({list.files(workDir, pattern="*.csv.gz", full.names=TRUE)}) 

Dann beobachte ich eine Schaltfläche Ereignis auszulösen, die Dateien in dem Ordner erneut scannen und die updateCheckboxGroupInput zu aktualisieren.

Ich legte einen Haltepunkt bei "print("File Scaned")".

Wenn wir die App starten, zeigt die Checkbox-Gruppe alle Dateien unter dem Ordner korrekt an.

Dann entfernen/füge ich Dateien unter Arbeitsordner, dann klicken Sie auf Neu scannen. Aber die Checkbox-Gruppe wird nicht aktualisiert.

Wenn das Programm am Haltepunkt angehalten wurde, habe ich den Wert "fullFilenames" und "fullFilenames()" überprüft und festgestellt, dass fullFilenames aktualisiert wurde, aber nicht fullFilenames(). Ich versuche die Logik hinter zwei Werten zu verstehen und finde einen Weg, um die Checkbox-Gruppe richtig zu aktualisieren.

Können Sie bitte etwas Hilfe zu diesem Thema geben?

Vielen Dank.

Siehe unten Code:

library(shiny) 
library(shinydashboard) 

workDir<-c("c:/files") 
setwd(workDir) 

ui <- dashboardPage(
    dashboardHeader(title = "Test Tool"), 
    dashboardSidebar(
    sidebarMenu(
     menuItem("Setup", tabName = "setup", icon = icon("cogs")) 
    ) 
), 
    dashboardBody(
    tabItem(tabName = "setup", 
     fluidRow(
     box(width = 12, 
      h1("Setup before generate dashboard"), 
      p(class = "text-muted", 
      br(), 
      "Default all files under working directory been selected, you also can choice your desired files.", 
      br(), 
      br() 
     ), 
      fluidRow(
      column(12, align="center", 
       actionButton("rescanFilesBtn","Rescan CSV Files") 
      ) 
     ) 
     ) 
    ), 
     fluidRow(
     column(width = 12, 
      box(width = NULL, style = "max-height: 500px", status = "info", solidHeader = TRUE, 
      title = "Change raw CSV files as you like", 
      textInput("csvFileFilter","Desired CSV Files", placeholder = "File names, separate by semicolon"), 
      checkboxGroupInput("selectedFiles", "", 
       choiceValues = NULL, 
       choiceNames= NULL, 
       selected = NULL 
      ) 
     ) 
     ) 
    ) 
    ) 
) 
) 

server <- function(input, output, session) { 


    fullFilenames <- reactive({list.files(workDir, pattern="*.csv.gz", full.names=TRUE)}) 

    observeEvent(input$rescanFilesBtn, { 
    print("Scan Files") 
    fullFilenames <- list.files(workDir, pattern="*.csv.gz", full.names=TRUE) 
    updateCheckboxGroupInput(session, "selectedFiles", choices = fullFilenames) 
    print("File Scaned") 
    }) 
} 

shinyApp(ui, server) 
+0

Können Sie ein reproduzierbares Beispiel angeben? – SBista

+0

@SBista, aktualisiert. Vielen Dank. –

Antwort

0

Ich habe Ihren Code geändert, so dass Sie eine aktualisierte Liste erhalten, nachdem die Rescan-Schaltfläche klicken.

checkboxGroupInput("selectedFiles", "", 
         choices = list.files(workDir, pattern="*.csv.gz", full.names=TRUE), 
         selected = NULL) 

getan Dies ist, weil die Auswahl nicht NULL sein können:

Im ui Teil habe ich Ihre checkboxGroupInput wie folgt geändert.

Ich habe eine Zeile in Ihrem Server-Code als Blindwert und lokale Variable nur kommentiert hatte den gleichen Namen, durch die Sie für jeden Wert waren nicht immer fullFilenames()

Dies ist der modifizierte Server:

server <- function(input, output, session) { 


     fullFilenames <- reactive({list.files(workDir, pattern="*.csv.gz", full.names=TRUE)}) 

     observeEvent(input$rescanFilesBtn, { 
     print("Scan Files") 
     # fullFilenames <- list.files(workDir, pattern="*.csv.gz", full.names=TRUE) 
     updateCheckboxGroupInput(session, "selectedFiles", choices = fullFilenames()) 
     print("File Scaned") 
     }) 
    } 

Hoffe, das hilft!

+0

Danke, @Sbista. Ich denke, es ist der richtige Weg, den reaktiven Ausdruck zu verwenden. Aber ich habe das schon mal versucht, das wird die Dateien nicht aktualisieren, alle behalten dieselbe Dateiliste wie beim Start der App. –

+0

Es scheint in meinem Fall zu funktionieren. Ich bin mir nicht sicher, was das Problem an deinem Ende ist. – SBista

+0

Hier ist meine Prozedur, um Fehler zu reproduzieren: Wenn ich nur die Anwendung starte, werden alle Dateien unter dem Ordner angezeigt. Wenn ich danach einige Dateien im Arbeitsverzeichnis lösche, klicken Sie auf die Schaltfläche zum erneuten Scannen. Es wird keine aktualisierte Dateiliste angezeigt. BTW, welches Betriebssystem wurde getestet? –

Verwandte Themen