You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Shiny应用中实现点击按钮返回前一个打开的Shiny应用页面

这个需求完全可以实现,以下是两个应用的完整实现方案:

App1 配置(点击按钮打开App2)

App1的逻辑是点击动作按钮后,调用前端JS在新标签页打开App2的地址,同时可以选择将自身地址作为query参数传递给App2,方便App2动态获取跳转回的地址,适配App1地址不固定的场景。

library(shiny)

ui <- fluidPage(
  actionButton("action1", "点击打开App2"),
  # 注册接收自定义消息的前端脚本
  tags$script(HTML("
    Shiny.addCustomMessageHandler('open_new_tab', function(url) {
      window.open(url, '_blank');
    });
  "))
)

server <- function(input, output, session) {
  observeEvent(input$action1, {
    # 替换为你的App2实际部署地址
    app2_url <- "http://你的App2部署地址"
    # 拼接App1的当前访问地址
    app1_current_url <- paste0(
      session$clientData$url_protocol, "//", 
      session$clientData$url_hostname, 
      ifelse(session$clientData$url_port == "", "", paste0(":", session$clientData$url_port)), 
      session$clientData$url_pathname
    )
    # 把App1地址编码后作为参数传给App2
    full_app2_url <- paste0(app2_url, "?app1_url=", URLencode(app1_current_url))
    session$sendCustomMessage("open_new_tab", full_app2_url)
  })
}

shinyApp(ui, server)
App2 配置(点击按钮跳转回App1)

App2可以直接读取URL中的query参数拿到App1的地址,点击按钮后调用JS跳转即可。如果你确定App1地址固定,也可以直接写死地址不用传参。

library(shiny)

ui <- fluidPage(
  actionButton("action2", "点击返回App1"),
  tags$script(HTML("
    Shiny.addCustomMessageHandler('jump_to_url', function(url) {
      // 如果你想跳转后保留App2标签,就用window.open(url, '_blank')替换下面的代码
      window.location.href = url;
    });
  "))
)

server <- function(input, output, session) {
  # 读取URL中传递的App1地址
  app1_url <- reactive({
    query <- parseQueryString(session$clientData$url_search)
    # 如果没拿到传参,也可以在这里写死App1的固定地址
    if(!is.null(query$app1_url)) {
      return(URLdecode(query$app1_url))
    } else {
      return("http://你的App1固定部署地址")
    }
  })
  
  observeEvent(input$action2, {
    session$sendCustomMessage("jump_to_url", app1_url())
  })
}

shinyApp(ui, server)
注意事项
  • 如果两个应用部署在同一个域名下,跳转逻辑不会有跨域限制,不同域名也可以正常跳转,只是无法共享session等数据,不影响基础跳转功能
  • 如果你不需要保留App2的标签页,用window.location.href直接替换当前页面即可,如果需要保留,改成window.open(url, '_blank')即可在新标签打开App1,保留App2的标签页

内容的提问来源于stack exchange,提问作者manu p

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 14:15:07