如何制作闪亮的模块以有条件地显示按钮?

时间:2016-07-20 02:43:58

标签: r shiny

目标是只有在ui1.R中输入内容时才有一个闪亮的模块lsuId激活提交按钮。当前代码没有检索到任何错误,但它似乎从不调用toggleState

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')

2 个答案:

答案 0 :(得分:3)

这是我如何处理这个问题:

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
      })

  }
)

这种方法并没有使用shinyjs,我认为这是一个积极的(较少的依赖),但我不知道你是否有兴趣这样做shinyjs并未在您的问题中说明。

在这里,ui.R只有一个带有inputId textInput的{​​{1}} UI元素,以及另一个UI元素将在server.R中呈现为'text.field'的承诺。

在server.R中,如果'submit.button'中的字符数为0,则output$submit.button设置为NULL,否则设置为input$text.field

答案 1 :(得分:0)

observe({
  if (is.null(input$lsuId) || input$lsuId == "") {
    shinyjs::disable("submit")
  } else {
    shinyjs::enable("submit")
  }
})
相关问题