【问题标题】:Shiny: conditionally build UIShiny:有条件地构建 UI
【发布时间】:2020-04-29 16:09:38
【问题描述】:

我正在构建一个闪亮的仪表板来显示大量数据。人们通过位于前面的单独登录页面(非 Shiny)访问仪表板,此时生成 JWT 并将其放入 cookie。我已经设法在 Shiny 中读取 cookie 并解析数据,将令牌保存在一个名为 userPermissions 的变量中。但是,现在我想根据用户权限在仪表板中显示/隐藏选项卡。

例如:我有关于经理和助理的数据。我想向使用userPermissions == '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)

此代码的问题在于,在浏览器控制台中,我收到错误 Can't find variable: userPermissions

我猜这里发生的事情是整个 ui 被执行,在 JS 可以抓取并返回 cookie 之前。解决这个问题的最佳方法是什么?

或者,也许我用错了方法。我显然需要验证 cookie 服务器端(即在R 中)不要泄露秘密;最好是这个检查,隐藏/显示在 Shiny 应用程序的一开始就完成了(userPermissions 在会话期间不会改变)。也许有一个不同的(和更好的)解决方案可以达到这一点?

任何帮助将不胜感激!

【问题讨论】:

  • 这还取决于您希望这些面板对其他用户“隐藏”的安全程度。如果确定未经许可的用户可以简单地在 chrome 控制台中关闭 display:none 并仍然查看内容

标签: r shiny


【解决方案1】:

最后我发现函数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 源代码中也不可用,因为它们甚至从未从服务器传递到客户端!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 2014-07-04
    相关资源
    最近更新 更多