对 menuItem() 选项卡选择做出反应
React to menuItem() tab selection
在 shinydashboard
中,可以创建 menuItem()
s,它们是边栏中的选项卡。我希望能够使用标准 input$foo
语法轮询哪个选项卡处于活动状态。
但是,我没能做到。我尝试引用 menuItem()
的 tabName
或 id
,但没有任何效果。
有办法吗?
sidebarMenu
有可选的 id 参数你可以使用它
sidebarMenu(id="menu1",
menuItem("PointA_",tabName = "PointA")
)
在服务器端使用 input$menu1
完整的工作示例,打印 PointA
或 PointB
(点击激活)
library(shiny)
library(shinydashboard)
ui <- dashboardPage(
dashboardHeader(
title = "Shiny"
),
dashboardSidebar(
sidebarMenu(id="sbmenu",
menuItem("PointA_",tabName = "PointA") ,
menuItem("PointB_",tabName = "PointB")
)
),
dashboardBody(
tabItems(
tabItem("PointA",h1("a")),
tabItem("PointB",h1("b"))
)
)
)
server <- function(input, output) {
observe(print(input$sbmenu))
}
shinyApp(ui,server)
更新
找到一些 hack 变体来执行 active+ dropdown + input
使用附加功能(了解想法 here)
工作示例:
library(shiny)
library(shinydashboard)
convertMenuItem <- function(mi,tabName) {
mi$children[[1]]$attribs['data-toggle']="tab"
mi$children[[1]]$attribs['data-value'] = tabName
if(length(mi$attribs$class)>0 && mi$attribs$class=="treeview"){
mi$attribs$class=NULL
}
mi
}
ui <- dashboardPage(
dashboardHeader(
title = "Shiny"
),
dashboardSidebar(
sidebarMenu(id="sbmenu",
convertMenuItem(menuItem("PointA_",tabName="PointA", selected=TRUE,
checkboxInput("tc", "Test check", value=FALSE)
),'PointA') ,
convertMenuItem(menuItem("PointB_",tabName="PointB",checkboxInput("tc2", "Test check", value=FALSE)
),'PointB')
)
),
dashboardBody(
tabItems(
tabItem("PointA",h1("a")),
tabItem("PointB",h1("b"))
)
)
)
server <- function(input, output) {
observe({
print(input$sbmenu)
})
}
shinyApp(ui,server)
奖金
我不知道关于 children 等的文档
但是如果你看看两者之间的差异
menuItem 和 menuItem+additionlal 元素你可以看到:
aa=menuItem("PointA_",tabName="PointA", selected=TRUE,
checkboxInput("tc", "Test check", value=FALSE)
)
aa1=menuItem("PointA_",tabName="PointA", selected=TRUE)
> aa
<li class="treeview">
<a href="#shiny-tab-PointA">
<span>PointA_</span>
<i class="fa fa-angle-left pull-right"></i>
</a>
<ul class="treeview-menu">
<div class="form-group shiny-input-container">
<div class="checkbox">
<label>
<input id="tc" type="checkbox"/>
<span>Test check</span>
</label>
</div>
</div>
</ul>
</li>
> aa1
<li>
<a href="#shiny-tab-PointA" data-toggle="tab" data-value="PointA" data-start-selected="1">
<span>PointA_</span>
</a>
</li>
如您所见,aa1
有 data-toggle="tab" data-value="PointA"
,您需要将其添加到 aa
但是 aa 有 class="treeview"
(我试图在检查中删除这个 class 以检查发生了什么变化)你需要删除它。
关于children你可以在Rstudio的环境视图中看到
在 shinydashboard
中,可以创建 menuItem()
s,它们是边栏中的选项卡。我希望能够使用标准 input$foo
语法轮询哪个选项卡处于活动状态。
但是,我没能做到。我尝试引用 menuItem()
的 tabName
或 id
,但没有任何效果。
有办法吗?
sidebarMenu
有可选的 id 参数你可以使用它
sidebarMenu(id="menu1",
menuItem("PointA_",tabName = "PointA")
)
在服务器端使用 input$menu1
完整的工作示例,打印 PointA
或 PointB
(点击激活)
library(shiny)
library(shinydashboard)
ui <- dashboardPage(
dashboardHeader(
title = "Shiny"
),
dashboardSidebar(
sidebarMenu(id="sbmenu",
menuItem("PointA_",tabName = "PointA") ,
menuItem("PointB_",tabName = "PointB")
)
),
dashboardBody(
tabItems(
tabItem("PointA",h1("a")),
tabItem("PointB",h1("b"))
)
)
)
server <- function(input, output) {
observe(print(input$sbmenu))
}
shinyApp(ui,server)
更新
找到一些 hack 变体来执行 active+ dropdown + input
使用附加功能(了解想法 here)
工作示例:
library(shiny)
library(shinydashboard)
convertMenuItem <- function(mi,tabName) {
mi$children[[1]]$attribs['data-toggle']="tab"
mi$children[[1]]$attribs['data-value'] = tabName
if(length(mi$attribs$class)>0 && mi$attribs$class=="treeview"){
mi$attribs$class=NULL
}
mi
}
ui <- dashboardPage(
dashboardHeader(
title = "Shiny"
),
dashboardSidebar(
sidebarMenu(id="sbmenu",
convertMenuItem(menuItem("PointA_",tabName="PointA", selected=TRUE,
checkboxInput("tc", "Test check", value=FALSE)
),'PointA') ,
convertMenuItem(menuItem("PointB_",tabName="PointB",checkboxInput("tc2", "Test check", value=FALSE)
),'PointB')
)
),
dashboardBody(
tabItems(
tabItem("PointA",h1("a")),
tabItem("PointB",h1("b"))
)
)
)
server <- function(input, output) {
observe({
print(input$sbmenu)
})
}
shinyApp(ui,server)
奖金
我不知道关于 children 等的文档
但是如果你看看两者之间的差异 menuItem 和 menuItem+additionlal 元素你可以看到:
aa=menuItem("PointA_",tabName="PointA", selected=TRUE,
checkboxInput("tc", "Test check", value=FALSE)
)
aa1=menuItem("PointA_",tabName="PointA", selected=TRUE)
> aa
<li class="treeview">
<a href="#shiny-tab-PointA">
<span>PointA_</span>
<i class="fa fa-angle-left pull-right"></i>
</a>
<ul class="treeview-menu">
<div class="form-group shiny-input-container">
<div class="checkbox">
<label>
<input id="tc" type="checkbox"/>
<span>Test check</span>
</label>
</div>
</div>
</ul>
</li>
> aa1
<li>
<a href="#shiny-tab-PointA" data-toggle="tab" data-value="PointA" data-start-selected="1">
<span>PointA_</span>
</a>
</li>
如您所见,aa1
有 data-toggle="tab" data-value="PointA"
,您需要将其添加到 aa
但是 aa 有 class="treeview"
(我试图在检查中删除这个 class 以检查发生了什么变化)你需要删除它。
关于children你可以在Rstudio的环境视图中看到