gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:30:14 26 4
gpt4 key购买 nike

  • 从 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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com