Meine Shiny App verfügt über mehrere Eingänge, die zur Definition mehrerer Parameter eines generierten Plots verwendet werden. Es ist sehr wahrscheinlich, dass der Benutzer einige Minuten damit verbringen wird, alle möglichen Optionen durchzugehen, bis er mit der Ausgabe zufrieden ist. Offensichtlich kann das Plot in verschiedenen Formaten exportiert werden, aber es ist möglich, dass der Benutzer später dasselbe Plot mit anderen Daten neu erstellen oder vielleicht nur ein kleines Detail ändern möchte.Alle Benutzereingaben in einer Shiny App in Datei exportieren und später laden
Aus diesem Grund muss ich dem Benutzer eine Möglichkeit bieten, alle seine Einstellungen zu exportieren und diese Datei für die spätere Verwendung zu behalten. Ich habe einen Ansatz entwickelt, aber es funktioniert nicht gut. Ich verwende reactiveValuesToList
, um die Namen aller Eingabeelemente zu erhalten und als einfache Textdatei im Format inputname=inputvalue
zu speichern. Dies ist die downloadHandler
auf server.R
:
output$bt_export <- downloadHandler(
filename = function() {
"export.txt"
},
content = function(file) {
inputsList <- names(reactiveValuesToList(input))
exportVars <- paste0(inputsList, "=", sapply(inputsList, function(inpt) input[[inpt]]))
write(exportVars, file)
})
Dies funktioniert gut, aber das Laden nicht sehr glatt gehen. Da ich den Eingabetyp nicht speichern möchte (und nicht herausfinden konnte, wie), muss ich die Werte blind aktualisieren. Dies ist, wie ich es tun:
importFile <- reactive({
inFile <- input$fileImport
if (is.null(inFile))
return(NULL)
lines <- readLines(inFile$datapath)
out <- lapply(lines, function(l) unlist(strsplit(l, "=")))
return(out)
})
observe({
imp <- importFile()
for (inpt in imp) {
if (substr(inpt[2], 0, 1) == "#") {
shinyjs::updateColourInput(session, inputId = inpt[1], value = inpt[2])
} else {
try({
updateTextInput(session, inputId = inpt[1], value = inpt[2])
updateNumericInput(session, inputId = inpt[1], value = inpt[2])
updateSelectInput(session, inputId = inpt[1], selected = inpt[2])
})
}
}
})
Neben den shinyjs::colorInput
, die von dem #
Start erkannt werden kann, ich habe try()
für die andere zu verwenden. Dies funktioniert teilweise, aber einige Eingaben werden nicht aktualisiert. Wenn Sie die exportierte Datei manuell überprüfen, werden die Eingaben angezeigt, die nicht aktualisiert wurden. Daher ist es wahrscheinlich keine gute Idee, 100 + Eingänge gleichzeitig zu aktualisieren. Auch der Teil sieht nicht gut aus und ist wahrscheinlich keine gute Idee.
Die App ist fast fertig, wird aber wahrscheinlich in der Zukunft aktualisiert werden, einige Eingaben hinzugefügt/geändert haben. Es ist akzeptabel, wenn dies sogar einige "alte" exportierte Eingaben ungültig macht, da ich versuchen werde, die Rückwärtskompatibilität beizubehalten. Aber ich suche nach einem Ansatz, der nicht nur Hunderte von Zeilen schreibt, um die Eingaben einzeln zu aktualisieren.
Ich habe über die Verwendung von save.image()
gedacht, aber einfach load()
verwendet nicht die App-Eingaben. Ich habe auch überlegt, irgendwie alle Eingaben auf einmal zu aktualisieren, anstatt nacheinander, aber nichts zu finden. Gibt es eine bessere Möglichkeit, alle Benutzereingaben in eine Datei zu exportieren und dann alle zu laden? Es spielt keine Rolle, ob es ein Tweak zu diesem ist, der besser funktioniert oder ein völlig anderer Ansatz.
Hat Ihre App stark abhängige Eingaben? Ist es eine Menge von 'renderUI' Blöcken oder ist es eine Menge von 'numericInput' -schennen Eingaben? – Mark
@Mark Sie sind alle "statische" Eingaben, keiner davon wird mit 'renderUI' erstellt. – Molx
@Molx Wenn Sie keine Lösung finden, mit der Sie zufrieden sind, kontaktieren Sie mich bitte. Wenn eine der Lösungen hier funktioniert, dann toll :) (schön zu sehen, dass mein colorInput verwendet wird!) –