2017-04-06 79 views
1

後,我有以下Shiny應用:如何直接到另一個網頁點擊一個tabpanel閃亮的應用

library(shiny) 

shinyApp(
    ui <- shinyUI(
    navbarPage("X-men", 
       tabPanel("",icon = icon("home", lib = "glyphicon") ), 
       tabPanel("Plot") 
      )), 
    server <- shinyServer(function(input, output) {}) 
) 
# Run the application 
shinyApp(ui = ui, server = server) 

它產生:

enter image description here

如前所述那裏。點擊主頁按鈕tabPanel()後,如何將網頁指向www.google.com?


更新

使用披的html centric way最新方法後:

enter image description here

回答

2

有您能做到這一點許多方式R和光澤。這裏有一個:

library(shiny) 
shinyApp(
shinyUI(
uiOutput("navigate") 
), 

shinyServer(function(input, output, session) { 
output$navigate <- renderUI({ 
    fixedPage(
    navbarPage("X-men",id = "navibar", 
       tabPanel("",icon = icon("home", lib = "glyphicon"),value = "home"), 
       tabPanel("Plot",value = "plot"), 
       selected = "plot" 
    ) 
) 
}) 
observeEvent(input$navibar,{ 
    if(input$navibar == "home"){ 
    browseURL("https://www.google.com") 
    } 
}) 
}) 
) 

基本上所有發生這就是是點擊打開瀏覽器窗口的URL.Here的也使用ui.R和server.R而不是一個實例的標籤,當observeEvent()功能被觸發一個文件。

ui.R

library(shiny) 

shinyUI(
fluidPage(
navbarPage("X-men",id = "navibar", 
         tabPanel("",icon = icon("home", lib = "glyphicon"),value = "home"), 
         tabPanel("Plot",value = "plot"), 
         selected = "plot" 
) 
) 
) 

server.R

library(shiny) 

shinyServer(function(input, output) { 
observeEvent(input$navibar,{ 
if(input$navibar == "home"){ 
    browseURL("https://www.google.com") 
} 
}) 
}) 

事實上,我們也能做到這一點更HTML爲主的方式,爲形狀建議,以更簡單:

library(shiny) 

shinyApp(
ui <- shinyUI(
navbarPage("X-men", 
      tabPanel(tags$a(href = 'http://google.com', icon("home", lib = "glyphicon"))), 
      tabPanel("Plot") 
     )), 
server <- shinyServer(function(input, output) {}) 
) 
+0

不適用於我。爲什麼?我複製粘貼你的整個代碼。 – neversaint

+0

我在複製的代碼中出現了一些錯誤,現在編輯它可以正常工作。 – Phi

+0

有沒有辦法保持ui.R中的navbarPage?邏輯上它更有意義。我有一個大的navbarPage。 – neversaint

1

只有UI的解決方案

沒有必要使用反應邏輯來重定向。我們只是想在html中加入一個鏈接。


有時閃亮可以讓你忘記你真的在做什麼只是在ui上寫html。

例如,如果我們打印的navbarPage輸出到控制檯,我們得到:

> navbarPage("X-men", 
+   tabPanel("",icon = icon("home", lib = "glyphicon") ), 
+   tabPanel("Plot") 
+) 
<nav class="navbar navbar-default navbar-static-top" role="navigation"> 
    <div class="container-fluid"> 
    <div class="navbar-header"> 
     <span class="navbar-brand">X-men</span> 
    </div> 
    <ul class="nav navbar-nav"> 
     <li class="active"> 
     <a href="#tab-8961-1" data-toggle="tab" data-value=""> 
      <i class=" glyphicon glyphicon-home"></i> 

     </a> 
     </li> 
     <li> 
     <a href="#tab-8961-2" data-toggle="tab" data-value="Plot">Plot</a> 
     </li> 
    </ul> 
    </div> 
</nav> 
<div class="container-fluid"> 
    <div class="tab-content"> 
    <div class="tab-pane active" data-value="" data-icon-class="glyphicon glyphicon-home" id="tab-8961-1"></div> 
    <div class="tab-pane" data-value="Plot" id="tab-8961-2"></div> 
    </div> 
</div> 

這裏的問題是,navbarPage是應用一些邏輯功能,它假設你只放一個tabpanel對象那裏並且它正在做對象非常特殊的事情(它在那個地方創建了一個鏈接,所以我們放入的任何鏈接都將被取消)。我們可以通過以下兩種方式之一來改變它。

1)寫HTML使用tag和/或tags對象,使自己的函數

首先是簡單地改寫navbarPage功能產生你追求的那種輸出的方式。

你可以看一下HTML製作的自舉導航欄頁面,並使用?tags?tag

(這是一個新的功能添加到閃亮的一個偉大的方式進行復制。我寫了一個包,速度把這個過程一個html字符串轉換爲等價的閃亮函數:https://github.com/shapenaji/midas)。但對於這樣的事情來說,這太過分了。

2)將希望的對象分解爲函數的輸出。

在這裏,我們真的只想用鏈接替換標頭中的主對象,所以我們只需要這樣做。

我們保存導航欄功能的輸出。

然後我們用我們想要的hack ... err ...鏈接替換那部分對象。

一個閃亮的對象,如navbarPage的輸出只是一個列表,我們可以像導航列表一樣導航到底部。 (在這個例子中,我們需要挖掘一點點以便深入到對象中,它在嵌套列表中相當深,但是您可以在控制檯中探索對象來替換您之後的對象。剛剛去皮列表一次一個。)

(我已刪除了shinyUI和shinyServer功能,因爲這些包裝不再是必要的,閃亮的當前版本)

library(shiny) 

shinyApp(

    ui = { 
     page <- 
     navbarPage("X-men",id = "navibar", 
        tabPanel("placeholder"), 
        tabPanel("Plot",value = "plot"), 
        selected = "plot" 
     ) 
     # Replace the second object in the navbar with the link 
     page[[3]][[1]]$children[[1]]$children[[2]]$children[[1]] <- 
     tags$li(tags$a(
      href = 'http://google.com', 
      icon("home", lib = "glyphicon") 
     ) 
     ) 
     # Finally return the page object, modified 
     page 
    }, 

    server = function(input, output, session) { 
    # No server code necessary (yet...) 
    } 
) 

如何我可以修改navbarPage()的包裝pped下fixedPage()

答:改變你修改一下,整個導航欄頁,現在是固定的頁面,這將增加page[[3]][[1]]$children[[1]]到開始

page[[3]][[1]]$children[[1]][[3]][[1]]$children[[1]]$children[[2]]$children[[1]] <- 
     tags$li(
     tags$a(
      href = 'http://google.com', 
      icon("home", lib = "glyphicon") 
     ) 
    ) 

EDIT 2中:一個更清潔的方式做它:

library(shiny) 

shinyApp(

    ui = { 
     page <- 
     navbarPage("X-men",id = "navibar", 
        tabPanel("placeholder"), 
        tabPanel("Plot",value = "plot"), 
        selected = "plot" 
     ) 
     # Replace the second object in the navbar with the link 
     page[[3]][[1]]$children[[1]]$children[[2]]$children[[1]] <- 
     tags$li(tags$a(
      href = 'http://google.com', 
      icon("home", lib = "glyphicon") 
     ) 
     ) 
     # Finally return the page object, wrapped by fixedPage 
     fixedPage(page) 
    }, 

    server = function(input, output, session) { 
    # No server code necessary (yet...) 
    } 
) 
+0

如果'navbarPage'封裝在'fixedPage'下,我該如何修改你的代碼請參閱我的更新你的文章的編輯。 – neversaint

+1

固定頁面是否必需?如果是這樣,那麼這個鏈接是在一個稍微不同的地方。雖然老實說,我會在那時寫下你自己的功能。 Bootstrap的導航頁面非常簡單。但讓我更新固定頁面至少 – Shape

+0

非常感謝。我真的很感激。我原來的應用程序是在'fixedPage()'我簡化了代碼以簡化。 – neversaint

相關問題