作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
moduleServer
而不是 callModule
. moduleServer
(与 callModule
不同)。 moduleServer
,以便我可以正确引用父 session 以获取 updateTabsetPanel
在 renderUI
内正常工作动态输出。 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/
从 Shiny 1.5.0 开始,we are encouraged使用 moduleServer而不是 callModule . 但是,似乎我们无法将其他参数传递给 moduleServer (与
我是一名优秀的程序员,十分优秀!