我希望能够使用 anactionLink导航到tabPanel嵌套tabsetPanels 中的 s。tabPanel如果我已经tabPanel选择了父级,我目前只能导航到特定的。这个命名法很快就会变得混乱,所以这里有一个嵌套的例子,tabPanels两个actionLinks 导航到两个 child tabPanels:
library(shiny)
ui <- {
fluidPage(
fluidRow(
column(3,
actionLink('subpanel_1a', 'Go to 1 A'),
br(),
actionLink('subpanel_1b', 'Go to 1 B')
),
column(9,
tabsetPanel(id = 'master_panel',
tabPanel('Primary panel 1',
tabsetPanel(id = 'primary_panel_1',
tabPanel('subpanel_1_a'),
tabPanel('subpanel_1_b')
)
),
tabPanel('Primary panel 2',
tabsetPanel(id = 'primary_panel_2',
tabPanel('subpanel_2_a'),
tabPanel('subpanel_2_b')
)
)
)
)
)
)
}
server <- function(input, output, session) {
observeEvent(input$subpanel_1a, {
updateTabsetPanel(session, 'primary_panel_1', 'subpanel_1_a')
})
observeEvent(input$subpanel_1b, {
updateTabsetPanel(session, 'primary_panel_1', 'subpanel_1_b')
})
}
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)
在actionLinkS“转到1个A”和“转到1个B”仅在当前选定父的工作tabPanel是“主面板1” ---他们没有工作,如果你是在“主面板2”。
actionLink无论您当前选择的面板如何,有没有办法绕过这种行为以使s 工作?
master_panel在更新子面板之前,您可以对您的 使用相同的“更新逻辑” 。
因此,对于 2a,它将显示为:
observeEvent(input$subpanel_2a, {
updateTabsetPanel(session, inputId = 'master_panel', selected = 'Primary panel 2')
updateTabsetPanel(session, inputId = 'primary_panel_2', selected = 'subpanel_2_a')
})
Run Code Online (Sandbox Code Playgroud)
可重现的代码:
library(shiny)
ui <- {
fluidPage(
fluidRow(
column(3,
actionLink('subpanel_1a', 'Go to 1 A'),
br(),
actionLink('subpanel_1b', 'Go to 1 B'),
br(),
actionLink('subpanel_2a', 'Go to 2 A'),
br(),
actionLink('subpanel_2b', 'Go to 2 B')
),
column(9,
tabsetPanel(id = 'master_panel',
tabPanel('Primary panel 1',
tabsetPanel(id = 'primary_panel_1',
tabPanel('subpanel_1_a'),
tabPanel('subpanel_1_b')
)
),
tabPanel('Primary panel 2',
tabsetPanel(id = 'primary_panel_2',
tabPanel('subpanel_2_a'),
tabPanel('subpanel_2_b')
)
)
)
)
)
)
}
server <- function(input, output, session) {
observeEvent(input$subpanel_1a, {
updateTabsetPanel(session, inputId = 'master_panel', selected = 'Primary panel 1')
updateTabsetPanel(session, inputId = 'primary_panel_1', selected = 'subpanel_1_a')
})
observeEvent(input$subpanel_1b, {
updateTabsetPanel(session, inputId = 'master_panel', selected = 'Primary panel 1')
updateTabsetPanel(session, inputId = 'primary_panel_1', selected = 'subpanel_1_b')
})
observeEvent(input$subpanel_2a, {
updateTabsetPanel(session, inputId = 'master_panel', selected = 'Primary panel 2')
updateTabsetPanel(session, inputId = 'primary_panel_2', selected = 'subpanel_2_a')
})
observeEvent(input$subpanel_2b, {
updateTabsetPanel(session, inputId = 'master_panel', selected = 'Primary panel 2')
updateTabsetPanel(session, inputId = 'primary_panel_2', selected = 'subpanel_2_b')
})
}
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)
按照这种方式,您可能会创建一些重复的代码。
根据您拥有的面板和子面板的数量,您可以尝试选择可以避免此更新非常重复的代码的名称。所以如果你有panel_1andpanel_1_a到panel_5and panel_5_d。您可以从字符串中动态读取“级别”。逻辑是panel_{FIRSTLEVELNR}_{SECONDLEVELNR}。然后你可以使用 sthg 像:
library(magrittr)
levels = panel_{FIRSTLEVELNR}_{SECONDLEVELNR} >%> strsplit(split = "_") %>% unlist
updateTabsetPanel(session, inputId = 'master_panel', selected = levels[2])
updateTabsetPanel(session, inputId = 'primary_panel_1', selected = levels[3])
Run Code Online (Sandbox Code Playgroud)
动态地为所有面板+子面板而不是重复 20 次。但就像我说的,这取决于您拥有的面板+子面板的数量以及所需的命名约定。
| 归档时间: |
|
| 查看次数: |
190 次 |
| 最近记录: |