闪亮:使用隐藏选项卡启动应用程序,没有延迟
shiny: start the app with hidden tabs, with NO delay
我想创建一个uild 应用程序,在用户输入正确的密码之前,某些选项卡将对用户隐藏。我知道如何使用 shinyjs::hideTab
:
library(shiny);library(shinyjs)
ui <- fluidPage(useShinyjs(),
navbarPage("hello", id="hello",
tabPanel("home", br(), h3("this is home"),passwordInput("pass", "enter 'password' to see the tabs: "),actionButton("enter", "enter")),
tabPanel("tab2", br(), h4("this is tab2")),
tabPanel("tab3 with a lot of stuff in it", br(), h4("this is tab3"))))
server <- function(input, output, session) {
hideTab("hello", "tab2"); hideTab("hello", "tab3 with a lot of stuff in it")
observeEvent(input$enter, {
if (input$pass == "password"){showTab("hello", "tab2"); showTab("hello", "tab3 with a lot of stuff in it")}})}
shinyApp(ui, server)
不过有一点"thing"。在我的应用程序中,隐藏选项卡有很多东西,如小部件、ui输出、绘图、图像、global.R 中的文件读取等。结果是加载时间更长,在此期间应用程序的加载时间(在 hideTab 指令获取 运行 之前)用户实际上看到了隐藏的选项卡,甚至可以单击它们并查看里面的内容。他们停留 "visible" 大约 1 秒然后隐藏起来。
有没有办法让它们在 UI 得到 built 之前立即隐藏?我更喜欢无需将所有 ui 代码放入 server.R 脚本的解决方案...
谢谢
这个怎么样
library(shiny);library(shinyjs)
ui <- fluidPage(useShinyjs(),
navbarPage("hello", id="hello",
tabPanel("home", br(), h3("this is home"),passwordInput("pass", "enter 'password' to see the tabs: "),actionButton("enter", "enter")),
tabPanel("tab2",uiOutput("tab2Content")),
tabPanel("tab3 with a lot of stuff in it", uiOutput("tab3Content"))))
server <- function(input, output, session) {
output$tab2Content <- renderUI({
req(input$pass == "password")
tagList(
br(),
h4("this is tab2")
)
})
output$tab3Content <- renderUI({
req(input$pass == "password")
tagList(
br(),
h4("this is tab3")
)
})}
shinyApp(ui, server)
希望对您有所帮助!
您可以使用 javascript 和 extendShinyjs()
来隐藏页面加载时您想要的标签:
Javascript代码:
shinyjs.init = function(){
$('#hello li a[data-value="tab3_val"]').hide();
$('#hello li a[data-value="tab2_val"]').hide();
}
R代码:
ui <- fluidPage(useShinyjs(),
#Added this js
extendShinyjs(script = path_to_javascript_file),
navbarPage("hello", id="hello",
tabPanel("home", br(), h3("this is home"),passwordInput("pass", "enter 'password' to see the tabs: "),actionButton("enter", "enter")),
tabPanel("tab2", value = "tab2_val", br(), h4("this is tab2")),
tabPanel("tab3 with a lot of stuff in it", value = "tab3_val", br(), h4("this is tab3"))))
server <- function(input, output, session) {
observeEvent(input$enter, {
if (input$pass == "password"){
show(selector = '#hello li a[data-value="tab3_val"]')
show(selector = '#hello li a[data-value="tab2_val"]')
}})}
shinyApp(ui, server)
或者 CSS 实际上并不太复杂。如果你想走那条路,你可以简单地将上面的 extendShinyjs()
调用替换为:
tags$head(tags$style(HTML("#hello li a[data-value = 'tab2_val'], #hello li a[data-value = 'tab3_val'] {
display: none;
}")))
缺点是选项卡的格式在取消隐藏后似乎已关闭。
我解决了这个问题,创建了一个新函数(在 UI 定义之上)以在右侧 li 标签中包含 style="display:none;
:
tabsethidepanels<-function(tag, indexes = NULL) {
if (class(tag) == "shiny.tag" && tag$name == "div" && tag$attribs$class == "tabbable") {
if (is.null(indexes)) indexes<-seq_along(tag$children[[1]]$children[[1]])
for (i in indexes) tag$children[[1]]$children[[1]][[i]]$attribs<-c(tag$children[[1]]$children[[1]][[i]]$attribs, list(style="display:none;"))
tag
} else stop("tag must be a tabsetPanel!", call. = F)
}
并相应地定义标签集:
tabsethidepanels(
tabsetPanel(
id = "mytab",
selected = "tab7-not2hide",
tabPanel("tab1"),
tabPanel("tab2"),
tabPanel("tab3"),
tabPanel("tab4"),
tabPanel("tab5"),
tabPanel("tab6"),
tabPanel("tab7-not2hide")
),
indexes = 1:6
)
"indexes" 字段对 select 只有隐藏正确的选项卡有用:
<div class="tabbable">
<ul class="nav nav-tabs shiny-tab-input" id="mytab" data-tabsetid="2818">
<li style="display:none;">
<a href="#tab-2818-1" data-toggle="tab" data-value="tab1">tab1</a>
</li>
<li style="display:none;">
<a href="#tab-2818-2" data-toggle="tab" data-value="tab2">tab2</a>
</li>
<li style="display:none;">
<a href="#tab-2818-3" data-toggle="tab" data-value="tab3">tab3</a>
</li>
<li style="display:none;">
<a href="#tab-2818-4" data-toggle="tab" data-value="tab4">tab4</a>
</li>
<li style="display:none;">
<a href="#tab-2818-5" data-toggle="tab" data-value="tab5">tab5</a>
</li>
<li style="display:none;">
<a href="#tab-2818-6" data-toggle="tab" data-value="tab6">tab6</a>
</li>
<li class="active">
<a href="#tab-2818-7" data-toggle="tab" data-value="tab7-not2hide">tab7-not2hide</a>
</li>
</ul>
<div class="tab-content" data-tabsetid="2818">
<div class="tab-pane" data-value="tab1" id="tab-2818-1"></div>
<div class="tab-pane" data-value="tab2" id="tab-2818-2"></div>
<div class="tab-pane" data-value="tab3" id="tab-2818-3"></div>
<div class="tab-pane" data-value="tab4" id="tab-2818-4"></div>
<div class="tab-pane" data-value="tab5" id="tab-2818-5"></div>
<div class="tab-pane" data-value="tab6" id="tab-2818-6"></div>
<div class="tab-pane active" data-value="tab7-not2hide" id="tab-2818-7"></div>
</div>
</div>
记得 select 一个选项卡不要隐藏为活动状态 selected = "tab7-not2hide"
。
如果您需要隐藏所有选项卡,我建议创建一个 "blank" tabPanel,select 他的选项卡处于活动状态并隐藏所有索引为 NULL 的选项卡。
我会选择 renderUI
(请参阅@BertilBaron 的回答)或 appendTab
,因为隐藏选项卡时很容易绕过密码:
以下是如何通过 appendTab
避免上述情况并使用基本闪亮实现所需的行为,无需额外的 JS:
library(shiny)
ui <- fluidPage(navbarPage("hello", id = "hello",
tabPanel(
"home",
br(),
h3("this is home"),
passwordInput("pass", "enter 'password' to see the tabs: "),
actionButton("enter", "enter")
)
))
server <- function(input, output, session) {
observeEvent(input$enter, {
if (input$pass == "password") {
appendTab(inputId = "hello", tab = tabPanel("tab2", value = "tab2_val", br(), h4("this is tab2")))
appendTab(inputId = "hello", tab = tabPanel("tab3 with a lot of stuff in it",value = "tab3_val", br(), h4("this is tab3")))
}
})
}
shinyApp(ui, server)
我想创建一个uild 应用程序,在用户输入正确的密码之前,某些选项卡将对用户隐藏。我知道如何使用 shinyjs::hideTab
:
library(shiny);library(shinyjs)
ui <- fluidPage(useShinyjs(),
navbarPage("hello", id="hello",
tabPanel("home", br(), h3("this is home"),passwordInput("pass", "enter 'password' to see the tabs: "),actionButton("enter", "enter")),
tabPanel("tab2", br(), h4("this is tab2")),
tabPanel("tab3 with a lot of stuff in it", br(), h4("this is tab3"))))
server <- function(input, output, session) {
hideTab("hello", "tab2"); hideTab("hello", "tab3 with a lot of stuff in it")
observeEvent(input$enter, {
if (input$pass == "password"){showTab("hello", "tab2"); showTab("hello", "tab3 with a lot of stuff in it")}})}
shinyApp(ui, server)
不过有一点"thing"。在我的应用程序中,隐藏选项卡有很多东西,如小部件、ui输出、绘图、图像、global.R 中的文件读取等。结果是加载时间更长,在此期间应用程序的加载时间(在 hideTab 指令获取 运行 之前)用户实际上看到了隐藏的选项卡,甚至可以单击它们并查看里面的内容。他们停留 "visible" 大约 1 秒然后隐藏起来。
有没有办法让它们在 UI 得到 built 之前立即隐藏?我更喜欢无需将所有 ui 代码放入 server.R 脚本的解决方案...
谢谢
这个怎么样
library(shiny);library(shinyjs)
ui <- fluidPage(useShinyjs(),
navbarPage("hello", id="hello",
tabPanel("home", br(), h3("this is home"),passwordInput("pass", "enter 'password' to see the tabs: "),actionButton("enter", "enter")),
tabPanel("tab2",uiOutput("tab2Content")),
tabPanel("tab3 with a lot of stuff in it", uiOutput("tab3Content"))))
server <- function(input, output, session) {
output$tab2Content <- renderUI({
req(input$pass == "password")
tagList(
br(),
h4("this is tab2")
)
})
output$tab3Content <- renderUI({
req(input$pass == "password")
tagList(
br(),
h4("this is tab3")
)
})}
shinyApp(ui, server)
希望对您有所帮助!
您可以使用 javascript 和 extendShinyjs()
来隐藏页面加载时您想要的标签:
Javascript代码:
shinyjs.init = function(){
$('#hello li a[data-value="tab3_val"]').hide();
$('#hello li a[data-value="tab2_val"]').hide();
}
R代码:
ui <- fluidPage(useShinyjs(),
#Added this js
extendShinyjs(script = path_to_javascript_file),
navbarPage("hello", id="hello",
tabPanel("home", br(), h3("this is home"),passwordInput("pass", "enter 'password' to see the tabs: "),actionButton("enter", "enter")),
tabPanel("tab2", value = "tab2_val", br(), h4("this is tab2")),
tabPanel("tab3 with a lot of stuff in it", value = "tab3_val", br(), h4("this is tab3"))))
server <- function(input, output, session) {
observeEvent(input$enter, {
if (input$pass == "password"){
show(selector = '#hello li a[data-value="tab3_val"]')
show(selector = '#hello li a[data-value="tab2_val"]')
}})}
shinyApp(ui, server)
或者 CSS 实际上并不太复杂。如果你想走那条路,你可以简单地将上面的 extendShinyjs()
调用替换为:
tags$head(tags$style(HTML("#hello li a[data-value = 'tab2_val'], #hello li a[data-value = 'tab3_val'] {
display: none;
}")))
缺点是选项卡的格式在取消隐藏后似乎已关闭。
我解决了这个问题,创建了一个新函数(在 UI 定义之上)以在右侧 li 标签中包含 style="display:none;
:
tabsethidepanels<-function(tag, indexes = NULL) {
if (class(tag) == "shiny.tag" && tag$name == "div" && tag$attribs$class == "tabbable") {
if (is.null(indexes)) indexes<-seq_along(tag$children[[1]]$children[[1]])
for (i in indexes) tag$children[[1]]$children[[1]][[i]]$attribs<-c(tag$children[[1]]$children[[1]][[i]]$attribs, list(style="display:none;"))
tag
} else stop("tag must be a tabsetPanel!", call. = F)
}
并相应地定义标签集:
tabsethidepanels(
tabsetPanel(
id = "mytab",
selected = "tab7-not2hide",
tabPanel("tab1"),
tabPanel("tab2"),
tabPanel("tab3"),
tabPanel("tab4"),
tabPanel("tab5"),
tabPanel("tab6"),
tabPanel("tab7-not2hide")
),
indexes = 1:6
)
"indexes" 字段对 select 只有隐藏正确的选项卡有用:
<div class="tabbable">
<ul class="nav nav-tabs shiny-tab-input" id="mytab" data-tabsetid="2818">
<li style="display:none;">
<a href="#tab-2818-1" data-toggle="tab" data-value="tab1">tab1</a>
</li>
<li style="display:none;">
<a href="#tab-2818-2" data-toggle="tab" data-value="tab2">tab2</a>
</li>
<li style="display:none;">
<a href="#tab-2818-3" data-toggle="tab" data-value="tab3">tab3</a>
</li>
<li style="display:none;">
<a href="#tab-2818-4" data-toggle="tab" data-value="tab4">tab4</a>
</li>
<li style="display:none;">
<a href="#tab-2818-5" data-toggle="tab" data-value="tab5">tab5</a>
</li>
<li style="display:none;">
<a href="#tab-2818-6" data-toggle="tab" data-value="tab6">tab6</a>
</li>
<li class="active">
<a href="#tab-2818-7" data-toggle="tab" data-value="tab7-not2hide">tab7-not2hide</a>
</li>
</ul>
<div class="tab-content" data-tabsetid="2818">
<div class="tab-pane" data-value="tab1" id="tab-2818-1"></div>
<div class="tab-pane" data-value="tab2" id="tab-2818-2"></div>
<div class="tab-pane" data-value="tab3" id="tab-2818-3"></div>
<div class="tab-pane" data-value="tab4" id="tab-2818-4"></div>
<div class="tab-pane" data-value="tab5" id="tab-2818-5"></div>
<div class="tab-pane" data-value="tab6" id="tab-2818-6"></div>
<div class="tab-pane active" data-value="tab7-not2hide" id="tab-2818-7"></div>
</div>
</div>
记得 select 一个选项卡不要隐藏为活动状态 selected = "tab7-not2hide"
。
如果您需要隐藏所有选项卡,我建议创建一个 "blank" tabPanel,select 他的选项卡处于活动状态并隐藏所有索引为 NULL 的选项卡。
我会选择 renderUI
(请参阅@BertilBaron 的回答)或 appendTab
,因为隐藏选项卡时很容易绕过密码:
以下是如何通过 appendTab
避免上述情况并使用基本闪亮实现所需的行为,无需额外的 JS:
library(shiny)
ui <- fluidPage(navbarPage("hello", id = "hello",
tabPanel(
"home",
br(),
h3("this is home"),
passwordInput("pass", "enter 'password' to see the tabs: "),
actionButton("enter", "enter")
)
))
server <- function(input, output, session) {
observeEvent(input$enter, {
if (input$pass == "password") {
appendTab(inputId = "hello", tab = tabPanel("tab2", value = "tab2_val", br(), h4("this is tab2")))
appendTab(inputId = "hello", tab = tabPanel("tab3 with a lot of stuff in it",value = "tab3_val", br(), h4("this is tab3")))
}
})
}
shinyApp(ui, server)