R 闪亮:有条件地构建UI
我正在构建一个闪亮的仪表板来显示大量数据。人们通过位于前面的单独登录页面(非闪亮)访问仪表板,此时生成JWT并将其放入cookie中。我已经设法在Shiny中读取cookie并解析数据,将令牌保存在名为R 闪亮:有条件地构建UI,r,shiny,R,Shiny,我正在构建一个闪亮的仪表板来显示大量数据。人们通过位于前面的单独登录页面(非闪亮)访问仪表板,此时生成JWT并将其放入cookie中。我已经设法在Shiny中读取cookie并解析数据,将令牌保存在名为userPermissions的变量中。不过,现在我想根据用户权限在仪表板中显示/隐藏选项卡。 例如:我有关于经理和助理的数据。我想向具有userPermissions=='manager'的任何用户显示manager数据,并向具有userPermissions==assistant的任何用户显示
userPermissions
的变量中。不过,现在我想根据用户权限在仪表板中显示/隐藏选项卡。
例如:我有关于经理和助理的数据。我想向具有userPermissions=='manager'
的任何用户显示manager数据,并向具有userPermissions==assistant
的任何用户显示助手数据
我认为最好的方法是使用conditionalPanel()
–下面是一个(简化的)可复制的示例:
library(shiny)
# UI file
ui <- fluidPage(
# JS to read cookie -- simplified to just return value!
tags$head(tags$script(
HTML('
Shiny.addCustomMessageHandler("goReadTheCookie", function (message) {
Shiny.onInputChange("cookie", "manager");
})
')
)
# Title
,titlePanel('Test')
# Navbar
,navbarPage(
id="navbar"
,conditionalPanel(condition = "userPermissions() == 'manager'",
mainPanel(textOutput('Manager data')))
,conditionalPanel(condition = "userPermissions() == 'assistant'",
mainPanel(textOutput('Assistant data')))
)
))
# Server file
server <- shinyServer(function(input, output,session){
## Grab permissions from Cookie
# Prepare output
userPermissions <- reactiveVal("")
# Tell JS to return cookie
session$sendCustomMessage(type="goReadTheCookie", message=list(name="cookie_name"))
# Listen for cookie
observeEvent(input$cookie,{
## -- Bunch of code omitted for sake of brevity -- ##
userPermissions("manager")
})
})
# Run app
shinyApp(ui=ui, server=server)
库(闪亮)
#用户界面文件
ui最后,我发现函数appendTab
正是我想要的。这需要在server.R
函数中运行,以查找cookie(否则userPermissions
确实不存在)。我可以这样做:
appendTab("navbar" # the id of the navigation bar created in ui.R
,tabPanel("tab name"
,mainPanel(...))
)
其中tabPanel(…)
可以是您通常放入ui.R
的任何内容
这里增加的好处是,隐藏选项卡在HTML源代码中也不可用,因为它们甚至从未从服务器传递到客户端 这还取决于您希望这些面板对其他用户“隐藏”的安全程度。如果确定是未经许可的用户,只需关闭chrome控制台中的显示:none
,即可查看内容