2017-01-17 1 views
0

Voraussetzungen: Shiny App mit einem Modul, das eine UI-Ausgabe enthält. Die UI-Ausgabe selbst enthält eine Eingabe (z. B. textInput). Alle IDs (von UIOutput und Input) sind ns()reaktive Eingabe Vektor verwendet merkwürdig in glänzenden Modulen

Beobachtungen erzeugt mit: mein input Vektor wird intern mit Zitaten gespeichert. Das wäre kein Problem, aber hindert mich daran, die Eingabe in Javascript (in conditionalInput(condition='input.myModule-myInputtest=="someText"')) zu verwenden. Wie kann ich erreichen, dass input$'mymodule' heißt input$myModule? Ist das ein Fehler oder mache ich etwas falsch?

Vielen Dank im Voraus und mit freundlichen Grüßen

app screenshot

Minimal Beispiel:

library(shiny) 

ui <- fixedPage(
    h2("Module example"), myModuleUI("myModule"), verbatimTextOutput("summary") 
) 
server <- function(input, output, session) { 
    callModule(myModule, "myModule", stringsAsFactors=F) 
    output$summary <- renderPrint({ reactiveValuesToList(input) }) 
} 
shinyApp(ui, server) 

myModuleUI <- function(id) { 
    ns <- NS(id) 
    uiOutput(ns("myInput")) 
} 
myModule <- function(input, output, session, stringsAsFactors) { 
    output$myInput <- renderUI({ textInput(ns("myInputtest"), "A Text Input") }) 
} 
+0

Kommentar: dies wahrscheinlich immer der Fall ist, wenn eine ID verwendet „-“. Wenn ich mein uiOutput als 'textInput (" myModule-myInput "," Eine Texteingabe ")' ändere, bleibt das Problem bestehen. Also ist das mit Glanz gemeint? Gibt es eine Problemumgehung? – shosaco

+0

Dies ist eine R-Funktion. Wie in allen R-Codes müssen Sie, wenn Sie einen nicht standardmäßigen Argument- oder Variablennamen verwenden müssen (z. B. einen mit Bindestrichen), auch Backticks in der Umgebung verwenden. –

Antwort

0

Sorry für meine eigene Frage zu beantworten, aber ich denke, das ist etwas anderes Leute würden begegnen ist.

Die Eingabe in Javascript (d. H. In einer Bedingung Bedingung) ist möglich über input['myModule-myInputtest'] anstelle der Punktnotation, die in Situationen ohne glänzende Module verwendet werden kann.

0

Sie müssen folgendes tun:

* Verwenden Taglist() innerhalb myModuleUI

* Verwenden Sie keine ns() innerhalb MyModule

Hinweis:

ns() verkettet die ID von callModule() mit einer beliebigen Zeichenfolge, die an sie übergeben wird. Zum Beispiel ns ("myInputtest") gibt "MyModule-myInputtest"

library(shiny) 

## Module UI ---- 
myModuleUI <- function(id) { 
    ns <- NS(id) 
    # taglist should be added here 
    tagList(
    uiOutput(ns("myInput")) 
) 
} 

## Module Server ---- 
myModule <- function(input, output, session, stringsAsFactors) { 
    output$myInput <- renderUI({ 
    textInput("myInputtest", 
       "A Text Input") 
    }) 
} 

## UI ---- 
ui <- fixedPage(
    h2("Module example"), 
    myModuleUI("myModule"), 
    verbatimTextOutput("summary") 
) 

## Server ---- 
server <- function(input, output, session) { 
    callModule(myModule, "myModule", stringsAsFactors=F) 
    output$summary <- renderPrint({reactiveValuesToList(input)}) 
} 

# Run the application --------------------------------------------------------- 
shinyApp(ui = ui, server = server) 

enter image description here

+1

Aber die Input ID sollte modularisiert werden, d. H. Im Namensraum von myModule - sonst muss ich alle InputIDs in meiner App im Auge behalten, so dass keiner "myInputtest" heißt. Die Lösung besteht darin, 'session $ ns (" myInputtest ")' anstatt nur ns() aufzurufen. Die Verwendung von 'tagList' wird für die Funktionalität nicht benötigt, wenn mehr als 1 Tags angegeben werden. Ich denke, dass die Anführungszeichen gemeint sind, aber meine Abhilfe bestand darin, den Listenselektor ('input ['myModule-myInputtest']') in Javascript und conditionalPanel zu verwenden. – shosaco

0

Sie einen sehr interessanten Rand Fall gefunden. Glücklicherweise gibt es eine andere Möglichkeit, auf input Kinder zuzugreifen, wie Sie bereits herausgefunden haben (verwenden Sie eckige Klammern anstelle von Punkten). Für alle, die auf dieses in der futre stolpern können, ist hier ein minimales Arbeitsbeispiel, einschließlich der bedingten Platte:

library(shiny) 

myModuleUI <- function(id) { 
    ns <- NS(id) 
    tagList(
    uiOutput(ns("myInput")), 
    conditionalPanel(
     condition = "input['myModule-myInputtest'] === 'hello'", 
     # condition = "console.log(input['myModule-myInputtest'])", # useful for debugging 
     sliderInput(ns("breakCount"), "Break Count", min=1, max=1000, value=10) 
    ) 
) 
} 
myModule <- function(input, output, session, stringsAsFactors) { 
    output$myInput <- renderUI({ 
    textInput(session$ns("myInputtest"), "A Text Input") 
    }) 
} 

ui <- fixedPage(
    h2("Module example"), 
    myModuleUI("myModule"), 
    verbatimTextOutput("summary") 
) 

server <- function(input, output, session) { 
    callModule(myModule, "myModule", stringsAsFactors=F) 
    output$summary <- renderPrint({ reactiveValuesToList(input) }) 
} 

shinyApp(ui, server)