Shiny: условно построить пользовательский интерфейс - PullRequest
0 голосов
/ 29 апреля 2020

Я создаю блестящую панель инструментов для отображения большого количества данных. Люди получают доступ к панели инструментов через отдельную страницу входа (не блестящую), которая находится впереди, после чего генерируется JWT и помещается в повар ie. Мне удалось прочитать в поваре ie в Shiny и проанализировать данные, сохранив токен в переменную с именем 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 сможет схватить и вернуть повара ie. Что было бы лучшим способом решить это?

Или, может быть, я поступаю неправильно. Очевидно, мне нужно проверить, что сервер ie на стороне сервера (т. Е. В R) не разглашает секрет; и предпочтительно эта проверка, и скрытие / отображение завершено в самом начале приложения Shiny (userPermissions не изменится во время сеанса). Может быть, есть другое (и лучшее) решение, чтобы добраться до этой точки?

Любая помощь будет очень признательна!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...