[发光]:在另一个tabPanel中将链接添加到另一个tabPanel

mih*_*asa 4 html r shiny

我试图在我的“首页” tabPanel上建立指向应用程序所有其他tabPanel的链接。

这个想法如下:

ui = navbarPage("",
         tabPanel("home",
                  fluidPage(
                    fluidRow(box("this 1st box should lead me to tab1a")),
                    fluidRow(box("this 2nd box should lead me to tab1b")),
                    fluidRow(box("this 2nd box should lead me to tab2")))
            ),
         navbarMenu("tab1",
                    tabPanel("tab1a"),
                    tabPanel("tab1b")),
         tabPanel("tab2")
         )
shinyApp(ui, server=function(input, output) {})
Run Code Online (Sandbox Code Playgroud)

我已经在Shiny的“添加链接面板”选项卡中看到了带有各种顶级导航栏的答案,但是我无法在我的代码中实现它,因为它处理的是html(我以前从未用过,所以我没有熟悉函数等),并且代码考虑带有相同选项卡的paneltabs(不确定这是为什么它在这里不起作用的原因,如果可能因为我要链接的选项卡在navbarpage上而不起作用) )。

谁能帮助我或告诉我在哪里可以学习如何在我的示例中实现它?

K. *_*hde 5

我猜这个答案是纯JavaScript的,但是很小。由于Shiny使用随机数ID创建标签,并且不提供对其使用的ID的访问权限,因此必须在客户端进行。但是,没有JavaScript知识可以将其实现到其他方案。JavaScript部分仅用于复制/粘贴,并且触发命令易于理解。

我做了什么 我安装了一个函数,该函数找到与所需选项卡相对应的导航栏链接,然后单击它。可以使用“ onclick”属性将该实用程序添加到任何元素。不需要特殊标签(例如,不需要“ a”标签)。

下面的代码应可以轻松自定义此解决方案以满足您的需求。

注意:box尽管没有任何视觉效果,但我将原始代码与一起使用。

码:

library(shiny)
library(shinydashboard)

ui = shinyUI(

  navbarPage("Header",
    tabPanel("home",
      tags$head(tags$script(HTML('
        var fakeClick = function(tabName) {
          var dropdownList = document.getElementsByTagName("a");
          for (var i = 0; i < dropdownList.length; i++) {
            var link = dropdownList[i];
            if(link.getAttribute("data-value") == tabName) {
              link.click();
            };
          }
        };
      '))),
      fluidPage(
        fluidRow(box("this 1st box should lead me to tab1a", onclick = "fakeClick('tab1a')")),
        fluidRow(box("this 2nd box should lead me to tab1b", onclick = "fakeClick('tab1b')")),
        fluidRow(box("this 2nd box should lead me to tab2", onclick = "fakeClick('tab2')"))
      )
    ), 
    navbarMenu("tab1",
      tabPanel("tab1a", "Some Text inside Tab 1a."),
      tabPanel("tab1b", "Some Text inside Tab 1b.")
    ),

    tabPanel("tab2", "Some Text inside Tab 2.")
  )
)

server = function(input, output, session){}

runApp(shinyApp(ui, server), launch.browser = TRUE)
Run Code Online (Sandbox Code Playgroud)

玩得开心!