2016-11-25 3 views
1

Ich schreibe eine glänzende App, die eine Tabelle hat (mit DT::renderDataTable), aus denen Benutzer eine Zeile auswählen können. Aber ich möchte, dass der Benutzer auch neue Zeilen hinzufügen kann, wenn das, was er will, nicht bereits in der Tabelle ist. Ich verwende Eingabesteuerelemente, damit der Benutzer neue Daten eingeben kann, und ich habe eine Aktionsschaltfläche, die, wenn sie gedrückt wird, eine neue Datenzeile in der Tabelle aus den Eingabewerten erstellen soll. Durch Drücken der Schaltfläche wird die Tabelle jedoch nicht aktualisiert.In Shiny, Update DataTable mit neuen Werten von Benutzereingabe

Ein minimales Beispiel:

library(shiny) 
library(DT) 
mydata = data.frame(id=letters[1:5], val=sample(10,5,T)) 

ui = fluidPage(dataTableOutput("table"), 
       textInput('NewID', 'Enter new ID'), 
       numericInput('NewVal', 'Enter new val', 1), 
       actionButton("goButton", "Update Table")) 

server = function(input,output){ 
    output$table = renderDataTable(mydata) 
    update = eventReactive(input$goButton, { 
    newrow = data.frame(id = input$NewID, val = input$NewVal) 
    mydata = rbind(mydata, newrow) 
    }) 
} 

shinyApp(ui,server) 

Offensichtlich ist dies der falsche Weg, dies zu nähern. Ich habe verschiedene Kombinationen der Verpackung sowohl renderDataTable und den Code zur Aktualisierung mydata innerhalb renderUI, observe und reactive versucht, aber ich kann nicht den richtigen Weg finden, dies zu tun.

Dies ist meine erste glänzende App, also vielleicht gibt es ein Grundkonzept, das ich nicht ganz verstehe. Was ist der richtige Weg?

+0

'Fehler in Kraft (Standard): Argument„Wert“fehlt, ohne default' – HubertL

+0

@HubertL Sie diese Fehlermeldung erhalten, wenn Paste und den Code ausführen? Es läuft ok für mich. – dww

+0

Ich muss den 'value' Parameter für' numericInput() ' – HubertL

Antwort

1

Sie können das Ergebnis von eventReactive rendern, wo Sie den aktualisierten Datensatz zurückgeben. Vergessen Sie nicht, <<- zu verwenden, um das globale Daten-Set zu ändern sowie:

server = function(input,output){ 
    output$table <- renderDataTable(df()) 
    df <- eventReactive(input$goButton, { 
    if(input$NewID!="" && !is.null(input$NewVal) && input$goButton>0){ 
     newrow = data.table(id = input$NewID, 
         val = input$NewVal) 
     mydata <<- rbind(mydata, newrow) 
     } 
    mydata 
    }, ignoreNULL = FALSE) 
} 
+0

Ausgezeichnet! Das ist fast da. Das einzige kleine Problem ist, dass eine neue Zeile mit einer leeren ID hinzugefügt wird, bevor die Schaltfläche gedrückt wird. Kannst du das unterdrücken? – dww

+0

Ich habe ein Häkchen 'input $ goButton> 0' hinzugefügt, was bedeutet, dass auf die Schaltfläche geklickt wurde – HubertL

+0

Dies wirft jetzt einen Fehler auf – user5249203

Verwandte Themen