2016-04-25 11 views
0

Ich wickle meinen Kopf um Shiny Module Nesting und habe dieses Problem.

Der Code für ein Beispiel Glänzende App mit der issue is available here. Kopieren-Einfügen in eine .R-Datei und Ausführen in RStudio sollte es replizieren.

Ich versuche, eine Hilfsfunktion zu machen, die alle data.frame filtert/aggregiert. Ich bin soweit, einige dynamische SelectInputs zu bekommen, was bereits nützlich ist, aber ich möchte nun diese SelectInputs in eine Schleife einfügen, damit ich eine data.frame unterteilen kann.

Das Problem scheint zu sein, dass die Eingaben, die innerhalb der Shiny-Server-Schleife generiert werden, nicht über normale Shiny-Module erreicht werden können, und die Syntax zum Auffinden ihrer Namen entzieht sich mir. Das Problem liegt in diesen Zeilen:

new_data <- reactive({ 
    old_data <- the_data() 
    for(i in seq_along(aggs)){ 

     str(i) ## debug to check its in loop 

     agg <- aggs[i] 

     ## How to access the dynamic_select inputs selected? 
     inputA <- input[[agg]] # is NULL? 
     old_col <- old_data[[agg]] 

     str(inputA) ## debug - NULL should hold values of dynamic inputs 

     new_data <- old_data[inputA %in% old_col,] 

     old_data <- new_data 

    } 

    new_data 

    }) 

Hat jemand eine Idee haben, wie die ausgewählten Werte zuzugreifen, die in variable inputA sehen sein sollte?

Antwort

2

Joe im Shiny Google-Gruppe geholfen, hat der Gist jetzt eine Arbeitsversion: https://gist.github.com/MarkEdmondson1234/7565787bb020b1c7cb691cf80e816d68

Hier seine Antwort war:

Die allgemeine Regel für Module Sie können nur auf den Wert der Eingabe einer moduleUI in der entsprechenden Modulserverfunktion zugreifen. In diesem Fall können Sie nur innerhalb von dynamicSelect auf den Wert dynamicSelectInput zugreifen. Wenn Sie diesen Wert dann für andere Module verfügbar machen möchten, müssen Sie ihn als eine reaktive Funktion von der Modulserverfunktion zurückgeben. In diesem Fall bedeutet das, dass die dynamicSelect Funktion mit dieser Linie enden soll: (. „Rückkehr“ ist optional, aber ich denke, es ist die Tatsache macht explizite hilft, dass reactive(input$dynamic_select) ist der Rückgabewert)

return(reactive(input$dynamic_select)) 

dann in outerTable, könnten Sie so etwas wie dies, anstatt Ihr for-Schleife tun:

selectResults <- lapply(setNames(aggs, aggs), function(agg) { 
    callModule(module = dynamicSelect, 
     id = agg, 
     the_data = the_data, 
     column = agg) 
    }) 

Jetzt selectResults ist eine benannte Liste, wobei jedes Element einen reaktiven Ausdruck zu sein (so selectResults[[agg]]() Wert abgerufen werden).

0

Das fühlt sich ganz „Hacky“, aber wenn Sie Ihre new_data zu reaktiven ändern

new_data <- reactive({ 
    old_data <- the_data() 
    for(i in seq_along(aggs)){ 
     str(i) ## debug to check its in loop 
     agg <- aggs[i] 
     inputA <- input[[paste0(aggs[i], '-dynamic_select')]] 
     old_col <- old_data[[agg]] 
     new_data <- old_data[inputA %in% old_col,] 
     old_data <- new_data 
    } 
    new_data 
    }) 

dann sollten Sie eine Ausgabe erhalten.

Was hier zu geschehen scheint ist, dass Ihre dynamischen Input-Elemente durch die ns() -Mühle zweimal (und unbedingt so) gemahlen wurden, so dass die Elemente auf der Webseite "debug_dynamic-mpg-dynamic_select" und "debug_dynamic- gear-dynamic_select " Indem Sie" -dynamic_select "in der reaktiven new_data fest codieren, sorgen Sie dafür, dass es funktioniert. Aber die Kosten sind, dass wenn Sie "dynamic-select" in Ihrer dynamicSelectUI ändern, müssen Sie auch daran denken, es in Ihrer Funktion new_data zu ändern. Der Code ist nicht DRY, aber das kann möglicherweise irgendwo mit einer Variablen behoben werden. Ich werde dir diese Kopfschmerzen hinterlassen.

Prost Dein Freund in Edinburgh