2016-03-24 16 views
3

Ich möchte dynamisch eine Reihe von Eingabe-Widgets erstellen, die in jeder Datentabelle verwendet werden. Ich bin in der Lage, eine solche Liste von Eingängen in der Tabelle anzuzeigen, habe jedoch Probleme beim Zugriff auf den Wert dieser dynamischen Eingänge.Verwenden von Shiny-Eingängen innerhalb einer DataTable-Ausgabe

ui.R

library(shiny) 

ui <- fluidPage(

    fluidRow(
    radioButtons('original','Normal Radio Button',c('1','2','3','4','5')), 
    DT::dataTableOutput("table") 
) 
) 

server.R

library(DT) 

multipleRadio <- function(FUN, id_nums, id_base, label, choices, ...) { 

    inputs <- 1:length(id_nums) 
    for (i in 1:length(inputs)) { 
    inputs[i] <- as.character(FUN(paste0(id_base, id_nums[i]),label, choices, ...)) 
    } 

    return(inputs) 
} 

radio_inputs <- multipleRadio(radioButtons, 
         as.character(1:3), 
         'input_', 
         'Radio Button', 
         c('1','2','3','4','5'), 
         inline = TRUE) 

output_table <- data.frame(id = c(1,2,3), 
          name=c('Item 1','Item 2','Item 3'), 
          select = radio_inputs) 


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

    observe({ 
    print(paste('original: ',input$original)) 
    print(paste('input 1: ',input$input_1)) 
    print(paste('input 2: ',input$input_2)) 
    print(paste('input 3: ',input$input_3)) 
}) 

    output$table <- renderDataTable({ 
    datatable(output_table,rownames= FALSE,escape = FALSE,selection='single', 
      options = list(paging = FALSE,ordering=FALSE,searching=FALSE)) 
    }) 
} 

I definieren, eine Funktion, die Eingänge mehrerer radiobutton erzeugt und wandelt diese in ihre HTML-Darstellung as.character verwenden. Dies erzeugt eine Reihe von Eingängen, deren IDs "Eingang_1", "Eingang_2" und "Eingang_3" sind. Ich fülle eine Spalte der Ausgabetabelle mit den Radioeingaben. Die Anzeige der radioButtons funktioniert wie erwartet. Ich sehe eins in jeder Reihe. input$input_1, input$input_2 und input$input_3 scheinen jedoch nicht zu existieren und es gibt keine Antwort auf das Klicken auf diese Schaltflächen. Irgendwelche Tipps, was hier falsch läuft, würden sehr geschätzt werden!

Edit:

fand ich hier eine Lösung: http://www.stackoverflow.red/questions/32993257/shiny-datatables-with-interactive-elements

Mit der Shiny.bindAll Funktion, wenn die Datentabelle erscheint Rendern der HTML-Eingänge in Shiny Eingabeobjekte zu konvertieren.

output$table <- renderDataTable({ 
    datatable(output_table,rownames= FALSE,escape = FALSE,selection='single', 
       options = list(paging = FALSE,ordering=FALSE,searching=FALSE, 
          preDrawCallback=JS('function() { Shiny.unbindAll(this.api().table().node()); }'), 
          drawCallback=JS('function() { Shiny.bindAll(this.api().table().node()); } '))) 
}) 
+0

Der Schlüssel besteht darin, die dynamischen Eingaben mit 'renderUI' zu erstellen. Siehe http://stackoverflow.com/questions/36094718/r-shiny-dynamic-input/36096128#36096128 für eine Frage, die ich zuvor beantwortet habe. –

+0

Danke, @warmoverflow. Sobald ich die Eingaben mit 'renderUI' erzeuge, wie fülle ich die Datentabelle mit ihnen? – Emily

+0

Sie lesen nur den Wert wie 'input $ input1' usw. –

Antwort

0

Ein korrektes shiny Eingabeobjekt ist ein shiny.tag Objekt, das Sie nicht in eine data.frame setzen können. Wenn Sie dies tun, werden Sie die folgende Fehlermeldung erhalten:

Fehler in as.data.frame.default (x [[i]], optional = TRUE, stringsAsFactors = stringsAsFactors): keine Klasse zwingen kann "" shiny.tag "" zu einem data.frame

in Ihrem Beispiel das radio_inputs Objekt, das Sie eine Liste von character tatsächlich erhalten, der reinen HTML-Code ist. Sie erhalten also immer noch die Benutzeroberfläche, aber sie funktionieren nicht mehr als glänzende Eingaben.

Ich denke, der einzige Weg ist, eine reine HTML-Tabelle zu verwenden, wenn Sie Radiobuttons oder andere glänzende Eingabeobjekte in einer Tabelle möchten.

Verwandte Themen