只有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...)
}
)
不適用於我。爲什麼?我複製粘貼你的整個代碼。 – neversaint
我在複製的代碼中出現了一些錯誤,現在編輯它可以正常工作。 – Phi
有沒有辦法保持ui.R中的navbarPage?邏輯上它更有意義。我有一個大的navbarPage。 – neversaint