r - 在 R Shiny 应用程序 : accessing parent environment for updateTabsetPanel 中将附加参数传递给 moduleServer

标签 r shiny

  • 从 Shiny 1.5.0 开始,we are encouraged使用 moduleServer而不是 callModule .
  • 但是,似乎我们无法将其他参数传递给 moduleServer (与 callModule 不同)。
  • 这是一个问题,因为我想将父 session 作为参数传递给 moduleServer ,以便我可以正确引用父 session 以获取 updateTabsetPanelrenderUI 内正常工作动态输出。

  • This post演示如何使用 callModule将父 session 传递到模块中,以便 updateTabsetPanel可以引用父 session 并相应地更新它。我使用这种方法在这里创建了一个最小的示例。有两个tabPanel s,我们正试图通过 actionLink 导航到第二个在第一个。 first_server使用 callModule 调用模块,并且我们能够将父 session 参数作为附加参数传递,允许我们在 updateTabsetPanel 中引用它来电first_server .点击actionLink然后将我们带到第二个模块 UI,如预期的那样:
    library(shiny)
    
    first_ui <- function(id) {
        ns <- NS(id)
        uiOutput(ns("goto_second_link_ui"))
    }
    
    second_ui <- function(id) {
        ns <- NS(id)
        p("It worked!")
    }
    
    first_server <- function(input, output, session, parent) {
        output$goto_second_link_ui <- renderUI({
            actionLink(session$ns("goto_second"), label = "Go to second module")
        })
        observeEvent(input$goto_second, {
            updateTabsetPanel(parent,
                inputId = "main",
                selected = "second"
            )
        })
    }
    
    ui <- {
        fluidPage(
            tabsetPanel(id = "main",
                tabPanel(value = "first",
                    title = "First module",
                    first_ui("first")    
                ),
                tabPanel(value = "second",
                    title = "Second module",
                    second_ui("second")    
                )
            )
        )
    }
    
    server <- function(input, output, session) {
        callModule(first_server, id = "first", parent = session)
    }
    
    shinyApp(ui, server)
    
    我已经尝试了几种方法来使它与 moduleServer 一起工作.我的最佳猜测是将父 session 一直传递到 module moduleServer 的论点(仅显示相关更改):
    first_server <- function(id, parent) {
        moduleServer(id, function(input, output, session, parent = parent) {
            output$goto_second_link_ui <- renderUI({
                actionLink(session$ns("goto_second"), label = "Go to second module")
            })
            observeEvent(input$goto_second, {
                updateTabsetPanel(parent,
                    inputId = "main",
                    selected = "second"
                )
            })
        })
    }
    
    server <- function(input, output, session) {
        first_server("first", parent = session)
    }
    
    当我单击 actionLink 时会产生错误我不完全理解:

    Warning: Error in updateTabsetPanel: promise already under evaluation: recursive default argument reference or earlier problems?


    感谢您的阅读和任何建议。

    最佳答案

    删除 moduleServer 中的额外参数后有用。试试这个

    library(shiny)
    
    first_ui <- function(id) {
      ns <- NS(id)
      uiOutput(ns("goto_second_link_ui"))
    }
    
    second_ui <- function(id) {
      ns <- NS(id)
      p("It worked!")
    }
    
    first_server <- function(id,parent) {
      moduleServer(id, function(input, output, session) {
        ns <- session$ns
        output$goto_second_link_ui <- renderUI({
          actionLink(ns("goto_second"), label = "Go to second module")
        })
        observeEvent(input$goto_second, {
          updateTabsetPanel(parent,
                            inputId = "main",
                            selected = "second"
          )
        })
      })
    }
    
    ui <- {
      fluidPage(
        tabsetPanel(id = "main",
                    tabPanel(value = "first",
                             title = "First module",
                             first_ui("first")    
                    ),
                    tabPanel(value = "second",
                             title = "Second module",
                             second_ui("second")    
                    )
        )
      )
    }
    
    server <- function(input, output, session) {
      first_server("first", parent = session)
    }
    
    shinyApp(ui, server)
    

    关于r - 在 R Shiny 应用程序 : accessing parent environment for updateTabsetPanel 中将附加参数传递给 moduleServer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67978609/

    相关文章:

    r - R 中有两种类型的双引号吗?我的双引号看起来倾斜并给出错误消息

    r - 如何在 R 中绘制这样的图形?

    r - R中的鼠标包,更新到鼠标3.0后,mipo对象不再返回方差协方差矩阵

    r - 在 Shiny Server 中识别用户 Web 浏览器信息

    R Shiny - 第 1 级没有此类指数

    r - 快速计算CDF/多列滚动连接

    r - dplyr和tail更改r中group_by中的最后一个值

    r - Shiny :renderPlot 与 Fluidrow 重叠

    r - 在 Shiny 中保存传单 map

    r - 'shiny' R包如何处理数据帧?