2016-07-20 16 views
-3

Das Ziel ist ein glänzendes Modul ui1.R zu haben, das den Submit Button nur aktiviert, wenn etwas in lsuId eingegeben wurde. Der aktuelle Code ruft keine Fehler ab, scheint aber niemals toggleState aufzurufen.Wie mache ich ein glänzendes Modul, um eine Schaltfläche bedingt anzuzeigen?

ui.R

library(shiny) 
library(shinyjs) 
htmlOutput("page") 

server.R

rm(list = ls()) 
library(shiny) 
library(dplyr) 
library(shinyjs) 
Logged <- FALSE 

shinyServer(function(input, output) { 

    observeEvent(input$"ui1Output-confirm", { 
    Logged <<- T 
    }) 

    observe({ 
input$"ui1Output-confirm" 
    if (Logged == FALSE) { 
     output$page <- renderUI({ 
     ui1Output('ui1Output') 
     }) 
     output$lsuId <- renderText({ input$lsuId }) 
    } 
    if (Logged == TRUE) 
    { 
     output$page <- renderUI({ ui2 }) 
    } 
    }) 
    callModule(ui1,'ui1') 
}) 

ui1.R

library(shinyjs) 

ui1Output <- function(id, label = "ui1") { 
    ns <- NS(id) 
    shinyUI(fluidPage(
    useShinyjs(), 
    titlePanel("Form"), 
    div(textInput(ns("lsuId"), "This has to be filled", ""), 
     actionButton(ns("confirm"), "Submit", class = "btn-primary") 
    ) 
)) 
} 

ui1 <- function(input, output, session) { 
    shinyjs::toggleState(id = "confirm", condition = F) 
    observeEvent(input$lsuId!="", { 
    shinyjs::toggleState(id = "confirm", condition = T) 
    }) 
} 

ui2.R

ui2<- shinyUI(fluidPage(
div("well done!") 
)) 

global.R

source('ui1.R') #login page 
source('ui2.R') 

Antwort

0
observe({ 
    if (is.null(input$lsuId) || input$lsuId == "") { 
    shinyjs::disable("submit") 
    } else { 
    shinyjs::enable("submit") 
    } 
}) 
+0

Haben Sie es selbst getestet und es funktioniert? – Dambo

1

Hier ist, wie ich dieses nähern würde:

ui.R

library(shiny) 

shinyUI(
    fluidPage(

    fluidRow(column(width = 12, 
        align = 'center', 
        h1('Conditional Submit Button'))), 

    fluidRow(column(width = 12, 
        align = 'center', 
        textInput(inputId = 'text.field', 
           label = 'What is your greatest fear?', 
           value = ''), 
        uiOutput('submit.button'))) 
) 
) 

server.R

library(shiny) 

shinyServer(
    function(input, output) { 

    output$submit.button <- 
     renderUI(expr = if (nchar(input$text.field)) { 
     submitButton() 
     } else { 
     NULL 
     }) 

    } 
) 

Dieser Ansatz verwendet nicht shinyjs, was meiner Meinung nach einer positiven (wenigen Abhängigkeiten) ist, aber ich weiß nicht, ob aus irgendeinem Grunde gibt es Sie es mit shinyjs dabei interessiert ist, die in nicht angegeben Ihre Frage.

Hier hat ui.R einfach ein textInput UI-Element mit inputId 'text.field' und einem Versprechen, dass ein anderes UI-Element wird in server.R 'submit.button' genannt gemacht werden.

In Server.R ist output$submit.button auf NULL eingestellt, wenn die Anzahl der Zeichen in input$text.field 0 ist, andernfalls auf submitButton().

+0

Behält Ihre Lösung den aktivierten/deaktivierten Effekt der Schaltfläche bei? Ich habe versucht, den Knopf dort nur in 2 verschiedenen Moden zu halten. – Dambo