服务器端模块化代码中的 actionButton 不起作用

问题描述

我正在使用 modalDialog 弹出窗口来允许在 github api 中记录问题。但是,由于 actionButton("ok","Submit new issue") 在模块化服务器端代码中,我相信由于它没有命名空间,所以按钮不起作用。我在下面提供了一个测试代码,当按下按钮时它应该显示标题,但它没有做任何事情。

有什么办法可以解决吗?

library(shiny)

editTableuI <- function(id){
  ns<-NS(id)
  tagList(
    actionButton(ns("add_issue"),"New Issue"),textoutput("text"))
  }
  
editTable <-function(input,output,session){
  
  observeEvent(input$add_issue,{
    loginModal <- function() {
      modalDialog(
        title = "Create Issue",textInput("title","Title"),textAreaInput("body","Body",placeholder = "Leave a comment",width = '100%',height = '300px' ),selectInput("asignee",label= "Assignees",selected = NULL,choices = c("a","b","c","d"),multiple = T ),footer = tagList(
          modalButton("Cancel"),actionButton("ok","Submit new issue")),fade = T,size = c("s")
        )
    }
    showModal(loginModal())
  })
  
  observeEvent(input$ok,{
  output$text <- renderText({ input$title })})
  
}
  

ui <- fluidPage(
  editTableuI("tab2"))
  
server <- function(input,session) {
  callModule(editTable,"tab2")}
  
shinyApp(ui,server)  

解决方法

我现在明白你的意思了,当你使用模块并在模块内创建对象时,你需要为它们分配命名空间,例如session$ns("ok"),然后您可以像这样访问它们:session$input$ok,类似于您拥有的 title 输入,下面的代码应该适合您...

library(shiny)

editTableUI <- function(id){
    ns <- NS(id)
    tagList(
        actionButton(ns("add_issue"),"New Issue"),textOutput(ns("text"))
    )
}

editTable <-function(input,output,session){
    
    observeEvent(input$add_issue,{
        loginModal <- function() {
            modalDialog(
                title = "Create Issue",textInput(session$ns("title"),"Title"),textAreaInput("body","Body",placeholder = "Leave a comment",width = '100%',height = '300px' ),selectInput("asignee",label= "Assignees",selected = NULL,choices = c("a","b","c","d"),multiple = T ),footer = tagList(
                    modalButton("Cancel"),actionButton(session$ns("ok"),"Submit new issue")),fade = T,size = c("s")
            )
        }
        showModal(loginModal())
    })
    
    observeEvent(session$input$ok,{
        output$text <- renderText({ 
            input$title 
        })
    })
    
}


ui <- fluidPage(
    editTableUI("tab2"))

server <- function(input,session) {
    callModule(editTable,"tab2")
    
}

shinyApp(ui,server)