2015-10-03 14 views
5

Ho un'applicazione lucida con molte schede e molti widget su ogni scheda. È un'applicazione basata sui dati, quindi i dati sono legati a ogni scheda.Salvataggio dello stato dell'app Shiny da ripristinare in seguito

I can possibile salvare l'applicazione utilizzando image.save() e creare un file .RData per l'utilizzo futuro.

Il problema è come posso ottenere lo stato ripristinato per i widget ?

Se l'utente ha selezionato caselle, pulsanti di opzione selezionati e valori di base specificati nelle caselle di elenco, è possibile impostare quelli all'interno di un passaggio load()?

ho avere librerie trovati quali shinyURL e shinystore ma c'è un modo diretto per impostare l'ambiente indietro a quando il write.image è stato fatto?

Non so da dove iniziare, quindi non posso inserire il codice.

edit: questo è un cross-post dalla Shiny Google Group dove altre soluzioni sono state suggerite

risposta

3

Questo è un po 'hacky, ma funziona. Utilizza una funzione "interna" (session$sendInputMessage) che non è destinata a essere chiamata esplicitamente, quindi non è garantito che funzioni sempre.

Si desidera salvare tutti i valori dell'oggetto input. Sto ricevendo tutti i widget usando reactiveValuesToList(input) (nota che questo salverà anche lo stato dei pulsanti, il che non ha senso). Un approccio alternativo sarebbe enumerare esattamente quali widget salvare, ma quella soluzione sarebbe meno generica e dovresti aggiornarla ogni volta che aggiungi/rimuovi un input. Nel codice qui sotto ho semplicemente salvato i valori in una lista chiamata values, puoi salvarla su file come desideri (RDS/file di testo/qualunque). Quindi il pulsante di caricamento esamina quell'elenco e aggiorna ogni input in base al valore nell'elenco.

C'è un'idea simile in this thread

library(shiny) 

shinyApp(
    ui = fluidPage(
    textInput("text", "text", ""), 
    selectInput("select", "select", 1:5), 
    uiOutput("ui"), 
    actionButton("save", "Save"), 
    actionButton("load", "Load") 
), 

    server = function(input, output, session) { 

    output$ui <- renderUI({ 
     tagList(
     numericInput("num", "num", 7), 
     checkboxGroupInput("chk", "chk", 1:5, c(2,4)) 
    ) 
    }) 

    observeEvent(input$save, { 
     values <<- lapply(reactiveValuesToList(input), unclass) 
    }) 

    observeEvent(input$load, { 
     if (exists("values")) { 
     lapply(names(values), 
       function(x) session$sendInputMessage(x, list(value = values[[x]])) 
      ) 
     } 
    }) 
    } 
) 
+1

ho avuto un grande successo con le risposte qui e filettature proposte. Grazie a tutti per il supporto. Ho una domanda di follow-up. Io uso sia rhandsontable che renderUI. Per il rstsontable sono in grado di usare la tecnica qui per salvarla e aggiornarla. Devo assicurarmi che il widget sia attivato in modo che la richiamata venga attivata quando l'app viene salvata. C'è un modo per forzare questo nel codice? renderUI è ancora un mistero ogni suggerimento sarebbe grandioso. – user2945234

Problemi correlati