根据 Shiny 应用程序中模块的输入禁用 UI 中的按钮

如何解决根据 Shiny 应用程序中模块的输入禁用 UI 中的按钮

在 Shiny 应用中,我尝试根据用户从模块输入的内容禁用/启用主应用 UI 中的操作按钮。基本上,我希望禁用“下一页”(submit) 按钮,直到用户响应最后一个项目 (item3)。当用户响应最后一个项目时,我希望启用该按钮。但是,我的应用没有更新操作按钮的切换状态。

这是一个使用 {Golem} 结构的最小可重现示例:

app_ui.R

library("shiny")
library("shinyjs")

app_ui <- function(request) {
  tagList(
    useShinyjs(),fluidPage(
      mod_mod1_ui("mod1_ui_1"),actionButton(inputId = "submit",label = "Next Page")
    )
  )
}

app_server.R

library("shiny")
library("shinyjs")

app_server <- function( input,output,session ) {
  state <- mod_mod1_server("mod1_ui_1")
  
  # Enable the "Next Page" button when the user responds to the last item
  observe({
    toggleState("submit",state == TRUE)
    })  
}

mod_mod1.R

library("shiny")
library("shinyjs")

mod_mod1_ui <- function(id){
  ns <- NS(id)
  tagList(
    radioButtons(inputId = ns("item1"),label = "Item 1",choices = c(1,2,3,4),selected = character(0)),radioButtons(inputId = ns("item2"),label = "Item 2",radioButtons(inputId = ns("item3"),label = "Item 3",selected = character(0))
  )
}

mod_mod1_server <- function(id){
  moduleServer( id,function(input,session){
    ns <- session$ns
    
    # When the user completes the last survey question
    completed <- logical(1)
    
    observe({
      lastQuestion <- input$item3
      if(!is.null(lastQuestion)){
        completed <- TRUE
      } else {
        completed <- FALSE
      }
      browser()
    })
    
    return(completed)
 
  })
}

使用 browser() 语句,completed 变量似乎在模块中正确更新,但 state 变量未在主应用程序中更新。

解决方法

我不清楚您是否希望在用户仅响应 item3 或所有项目(1 到 3)时使用此功能。我假设是后者。但是,您可以根据用例需要进行修改。定义 reactiveValues 对象有效。试试这个

library("shiny")
library("js")

mod_mod1_ui <- function(id){
  ns <- NS(id)
  tagList(
    radioButtons(inputId = ns("item1"),label = "Item 1",choices = c(1,2,3,4),selected = character(0)),radioButtons(inputId = ns("item2"),label = "Item 2",radioButtons(inputId = ns("item3"),label = "Item 3",selected = character(0))
  )
}

mod_mod1_server <- function(id){
  moduleServer( id,function(input,output,session){
    ns <- session$ns
    
    # When the last survey question is completed
    rv <- reactiveValues(completed=1)
    
    observe({
      lastQuestion <- input$item3
      if(!is.null(lastQuestion) & !is.null(input$item2) & !is.null(input$item1)){
        rv$completed <- 1
      } else {
        rv$completed <- 0
      }
      print(rv$completed )
      #browser()
      
    })
    
    return(rv)
  })
}

app_ui <- function(request) {
  fluidPage(
    useShinyjs(),tagList(
      mod_mod1_ui("mod1_ui_1"),actionButton(inputId = "submit",label = "Next Page") 
    )
  )
}

app_server <- function( input,session ) {
  state <- mod_mod1_server("mod1_ui_1")
  
  # Don't show "Next Page" button until last item is completed
  observe({
    toggleState("submit",state$completed == TRUE)
  })
 
}

shinyApp(ui = app_ui,server = app_server)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?