2017-01-17 1 views
0

Prérequis: Application brillante utilisant un module qui contient une sortie d'interface utilisateur. La sortie de l'interface utilisateur elle-même contient n'importe quelle entrée (par exemple, textInput). Tous les ID (de UIOutput et d'entrée) sont générés à l'aide ns()vecteur d'entrée réactif utilise étrangement des guillemets dans des modules brillants

Observations: mon input Vector est enregistrée en interne avec des guillemets. Cela ne poserait aucun problème mais m'empêche d'utiliser l'entrée en javascript (au conditionalInput(condition='input.myModule-myInputtest=="someText"')). Comment puis-je obtenir que input$'mymodule' s'appelle input$myModule? Est-ce un bug ou est-ce que je fais quelque chose de mal?

Merci à l'avance et meilleures salutations

app screenshot

exemple minimal:

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

commentaire: c'est probablement toujours le cas lorsqu'un ID utilise « - ». Lorsque je change mon uiOutput en 'textInput (" myModule-myInput "," A Text Input ")', le problème persiste. Donc, cela est prévu par brillant? Y at-il un travail autour? – shosaco

+0

Ceci est une fonctionnalité de R. Comme dans tout code R, si vous avez besoin d'utiliser un argument ou un nom de variable non standard (par exemple un qui inclut des tirets), vous devrez également utiliser des backticks autour de celui-ci. –

Répondre

0

Désolé pour répondre à ma propre question, mais je pense que c'est quelque chose d'autres personnes rencontreraient. L'utilisation de l'entrée en javascript (c'est-à-dire dans un état conditionPanel) est possible via input['myModule-myInputtest'], au lieu de la notation par points qui peut être utilisée dans des situations sans modules brillants.

0

Vous devez effectuer les opérations suivantes:

* Utilisez tagList() à l'intérieur myModuleUI

* Ne pas utiliser ns() à l'intérieur monModule

Remarque:

ns() concatène l'identifiant de callModule() avec n'importe quelle chaîne qui lui est passée. Par exemple ns ("myInputtest") donne "monModule-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

Toutefois, l'ID d'entrée doit être modulaire, c'est-à-dire dans l'espace de noms de myModule. Dans le cas contraire, je dois garder la trace de tous les InputID dans mon application afin qu'aucun ne s'appelle myInputtest. La solution ici est d'appeler 'session $ ns (" myInputtest ")' au lieu de simplement ns(). L'utilisation de 'tagList' n'est pas nécessaire pour la fonctionnalité, juste quand plus de 1 balises sont données. Je pense que les citations sont destinées, mais ma solution de contournement consistait à utiliser le sélecteur de liste ('input ['myModule-myInputtest']') dans javascript et conditionnelPanel. – shosaco

0

Vous avez trouvé une affaire de bord très intéressant. Heureusement, il existe un autre moyen d'accéder aux enfants input, comme vous l'avez déjà découvert (utilisez des crochets au lieu de points). Pour tous ceux qui peuvent tomber sur ce dans le Futre, voici un exemple de travail minimal, y compris le panneau conditionnel:

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)