从HTML文本(嵌套在ShinyServer中)链接到特定的Shiny tabPanel(在ShinyUI中)

时间:2018-08-17 09:16:51

标签: r shiny

我正在寻找一种方法,可以将HTML文本(嵌套在服务器部分)链接到特定的Shiny tabPanel(嵌套在UI中)。假设我们有以下应用程序:

library(shiny)

shinyUI(fluidPage(
  sidebarLayout(
    mainPanel(
      tabsetPanel(
        type="tabs",
        tabPanel("Contents", htmlOutput("contents")),
        tabPanel("Plot", plotOutput("plot")) # <- A link to here
      )
    )
  )
))

shinyServer(function(input, output) {
  output$contents <- renderText({
    HTML("A link to <a href='#Plot'>Plot</a>") # <- from there
  })

  output$plot({
    some ggplot
  })
})

如何在文本中创建一个链接,然后将其重定向到某个选项卡。我尝试了锚标记,但由于ID在应用程序的每次启动时都不断变化,因此它们似乎无法正常工作。

谢谢。

2 个答案:

答案 0 :(得分:1)

我不知道使用链接是否可行。但是您可以使用按钮和updateTabsetPanel

library(shiny)
library(ggplot2)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(),
    mainPanel(
      tabsetPanel(
        type="tabs",
        id = "tabset",
        tabPanel("Contents", actionButton("go", "Go to plot")),
        tabPanel("Plot", plotOutput("plot")) 
      )
    )
  )
)

server <- function(input, output, session) {

  observeEvent(input$go, {
    updateTabsetPanel(session, "tabset", "Plot")
  })

  output$plot <- renderPlot({
    ggplot(mtcars, aes(x=cyl, y=disp)) + geom_point()
  })
}

shinyApp(ui, server)

答案 1 :(得分:0)

由于斯特凡·洛朗(StéphaneLaurent)向我指出了正确的方向,所以我设法创建了所需的解决方案。为了将所有HTML文本保留在服务器功能中,我使用了renderUIactionLink的组合。现在,解决方案如下所示:

library(shiny)

shinyUI(fluidPage(
  sidebarLayout(
    mainPanel(
      tabsetPanel(
        type="tabs",
        id = "tabset", # <- Key element 1
        tabPanel("Contents", htmlOutput("contents")),
        tabPanel("Plot", plotOutput("plot"))
      )
    )
  )
))

shinyServer(function(input, output, session) {
  output$contents <- renderUI({ # <- Key element 2
    list(
      HTML(<p>Some text..</p>),
      actionLink("link", "Link to Plot") # <- Key element 3
    )
  })

  observeEvent(input$link, {updateTabsetPanel(session, "tabset", "Plot")}) # <- Key element 4

  output$plot({
    some ggplot
  })
})