R 闪亮:有条件地构建UI

R 闪亮:有条件地构建UI,r,shiny,R,Shiny,我正在构建一个闪亮的仪表板来显示大量数据。人们通过位于前面的单独登录页面(非闪亮)访问仪表板,此时生成JWT并将其放入cookie中。我已经设法在Shiny中读取cookie并解析数据,将令牌保存在名为userPermissions的变量中。不过,现在我想根据用户权限在仪表板中显示/隐藏选项卡。 例如:我有关于经理和助理的数据。我想向具有userPermissions=='manager'的任何用户显示manager数据,并向具有userPermissions==assistant的任何用户显示

我正在构建一个闪亮的仪表板来显示大量数据。人们通过位于前面的单独登录页面(非闪亮)访问仪表板,此时生成JWT并将其放入cookie中。我已经设法在Shiny中读取cookie并解析数据,将令牌保存在名为
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
,即可查看内容