2016-11-18 5 views
0

Die glänzende Anwendung hat die folgenden Elemente:anzeigen/verbergen Eingänge basierend auf numericInput und actionButton

  • eine numericInput Feld mit Werten zwischen 0 und 3
  • einem uiOutput den drei versteckten textInput Felder enthält
  • eine actionButton

Was möchte ich erreichen möchte, ist die versteckte Felder nach einem Klick klicken. Die Anzahl der angezeigten Felder hängt von der Nummer ab, die in der numericInputvoll funktionsfähigen Code unter erreicht wird; Es gibt jedoch ein Problem, für das ich keine Lösung finden kann. Zum Beispiel, wenn ich 3 auswähle und auf den Knopf klicke, erscheinen die 3 versteckten textInput Felder (yay!), Aber wenn ich dann sofort eine Zahl niedriger als 3 auswähle und auf den Knopf klicke, bleiben die unerwünschten Felder immer noch. Wie kann ich das erreichen? Danke

library(shiny) 
library(shinyjs) 

ui <- fluidPage(

    useShinyjs(), 

    numericInput(inputId = "num", label = "How many inputs do you want to show?", value = 1, min = 1, max = 3), 

    uiOutput(outputId = "out"), 

    actionButton(inputId = "go", label = "Click me!") 
) 

server <- function(input, output){ 

    output$out <- renderUI({ 
    numinputs <- lapply(1:3, function(i){ 
     textInput(inputId = paste0("txt", i), label = paste0("Text input ", i)) 
    }) 
    shinyjs::hidden(numinputs) 
    }) 

    observeEvent(eventExpr = input$go, handlerExpr = { 
    for(i in seq(input$num)){ 
     shinyjs::show(id = paste0("txt", i)) 
    } 
    }) 
} 

shinyApp(ui = ui, server = server) 

Antwort

1

Dieser Code ähnelt @SBista, aber ohne die nout Variable.

library(shiny) 
library(shinyjs) 

ui <- fluidPage(

    useShinyjs(), 

    numericInput(inputId = "num", label = "How many inputs do you want to show?", value = 1, min = 1, max = 3), 

    uiOutput(outputId = "out"), 

    actionButton(inputId = "go", label = "Click me!") 
) 

server <- function(input, output){ 
    output$out <- renderUI({ 
     numinputs <- lapply(1:3, function(i){ 
      textInput(inputId = paste0("txt", i), label = paste0("Text input ", i)) 
     }) 
     shinyjs::hidden(numinputs) 
    }) 

    observeEvent(eventExpr = input$go, handlerExpr = { 
     n <- seq(length.out = as.numeric(input$num)) 
     lapply(seq(3), function(i) { 
      if(i %in% n) { 
       shinyjs::show(id = paste0("txt", i)) 
      } else{ 
       shinyjs::hide(id = paste0("txt", i)) 
      } 
     }) 
    }) 
} 

shinyApp(ui = ui, server = server) 

#edit - ohne shinyjs/dinamically

Schaffung
# if you comment the lines marked with # no-button 
# the app will change the number of textInputs as soon as you change the numericInput 
library(shiny) 

ui <- fluidPage(
    numericInput(inputId = "num", label = "How many inputs do you want to show?", value = 1, min = 1, max = 3), 
    uiOutput(outputId = "out"), 
    actionButton(inputId = "go", label = "Click me!") # no-button 
) 

server <- function(input, output){ 
    output$out <- renderUI({ 
     input$go # no-button 
     isolate(# no-button 
      numinputs <- lapply(seq(length.out = req(input$num)), function(i){ 
       textInput(inputId = paste0("txt", i), label = paste0("Text input ", i)) 
      }) 
     ) # no-button 
    }) 
} 

shinyApp(ui = ui, server = server) 
+0

Ich schätze die Hilfe sehr. – SavedByJESUS

+0

Ich habe in meiner Antwort nicht viel erklärt. Hast du verstanden, was wir dort gemacht haben? 'hidden()' initialisiert nur 'textInput()' als unsichtbares Objekt. 'show()' und 'hide()' sind diejenigen, die auf den Benutzer reagieren. – user5029763

+0

habe ich ganz gut verstanden. Was ich nicht herausfinden konnte (vor Ihrer Antwort), war die Art, wie Sie die 'n'-Variable und die' lapply'-Schleife einrichten. Sehr geschickt gemacht! – SavedByJESUS

1

Ich habe Ihren Code geändert, um genau das zu tun, was Sie wollten.

library(shiny) 
library(shinyjs) 

ui <- fluidPage(

    useShinyjs(), 

    numericInput(inputId = "num", label = "How many inputs do you want to show?", value = 1, min = 1, max = 3), 

    uiOutput(outputId = "out"), 

    actionButton(inputId = "go", label = "Click me!") 
) 

server <- function(input, output){ 
    nout <- 0 

    output$out <- renderUI({ 
    numinputs <- lapply(1:3, function(i){ 
     textInput(inputId = paste0("txt", i), label = paste0("Text input ", i)) 
    }) 
    shinyjs::hidden(numinputs) 
    }) 

    observeEvent(eventExpr = input$go, handlerExpr = { 


     if(nout > input$num){ # If the current no. of inputs is less than previous hide the inputs 
     for(i in nout:(nout-as.numeric(input$num))){ 
      shinyjs::hide(id = paste0("txt", i)) 
     } 

     }else{ 
     for(i in seq(input$num)){ 
     shinyjs::show(id = paste0("txt", i)) 
     } 

    } 

    nout <<- input$num 
    }) 
} 

shinyApp(ui = ui, server = server) 

Hoffe es hilft!

+0

Es hilft, eine Tonne. Vielen Dank. – SavedByJESUS

+0

@SavedByJESUS ​​Können Sie die Antwort (https://Stackoverflow.com/help/someone-answers) akzeptieren, wenn es Ihnen geholfen hat? – SBista

Verwandte Themen