如何为 Shiny 应用程序的不同用户创建不同的仪表板?(在同一个应用程序代码上)

Wil*_*ior 5 r shiny

我需要创建一个 Shiny 应用程序,它将为 6 个不同的用户生成 6 个不同版本的相同仪表板布局。每个用户在生产过程中都会看到自己的历史数据,并且都在同一个数据库中(我猜我只需要为每个特定用户过滤整个数据库)。

具体来说:

1 - 我如何检测哪个用户是哪个?我将使用身份验证,所以我猜我可以通过他的登录方式从用户那里检索信息。但是我如何用代码检索这些信息呢?

2 - 知道哪个用户是哪个,我如何在同一个应用程序代码上创建 6 个不同的版本?它们将是相同的布局,唯一的区别是基于用户的数据集过滤。

(可选) 3 - Shiny 服务器如何协调不同用户的显示?考虑具有用户交互的仪表板,不同的输入不会干扰彼此的显示?他们是否必须为每次访问复制代码,以便获得独立的结果?

我还没有做到,即使我做到了,我认为在这里解决也太复杂了,所以我发布了 Shiny 的 Hello World。这样,假设用于绘制直方图的数据集有一个名为“user”的列。用于区分用户的代码是什么?

library(shiny)

  output$distPlot <- renderPlot({

    dist <- dataset[1:obs,1] %>% filter(???)
    hist(dist)
  })

})

shinyUI(fluidPage(

  titlePanel("Hello Shiny!"),

  # Sidebar with a slider input for number of observations
  sidebarLayout(
    sidebarPanel(
      sliderInput("obs", 
                  "Number of observations:", 
                  min = 1, 
                  max = 1000, 
                  value = 500)
    ),  

    mainPanel(
      plotOutput("distPlot")
    )
  )
))
Run Code Online (Sandbox Code Playgroud)

谢谢!

DSG*_*Gym 3

login1 <- c("user1", "pw1")
login2 <- c("user2", "pw2")

library(shiny)

# Define UI for application that draws a histogram
ui <- fluidPage(

    # Application title
    uiOutput("ui")

    # Sidebar with a slider input for number of bins 
)

# Define server logic required to draw a histogram
server <- function(input, output) {

    logged <- reactiveValues(logged = FALSE, user = NULL)

    observeEvent(input$signin, {
        if(input$name == "user1" & input$pw == "pw1") {
            logged$logged <- TRUE
            logged$user <- "user1"
        } else if (input$name == "user2" & input$pw == "pw2") {
            logged$logged <- TRUE
            logged$user <- "user2"
        } else {}
    })


    output$ui <- renderUI({


        if(logged$logged == FALSE) {
            return(
                tagList(
                    textInput("name", "Name"),
                    passwordInput("pw", "Password"),
                    actionButton("signin", "Sign In")
                )
            )
        } else if(logged$logged == TRUE & logged$user == "user1") {
            return(
                tagList(
                    titlePanel("This is user 1 Panel"),
                    tags$h1("User 1 is only able to see text, but no plots")
                )
            )
        } else if(logged$logged == TRUE & logged$user == "user2") {
            return(
                tagList(
                    titlePanel("This is user 2 Panel for Executetives"),
                    sidebarLayout(
                        sidebarPanel(
                            sliderInput("bins",
                                        "Number of bins:",
                                        min = 1,
                                        max = 50,
                                        value = 30)
                        ),


                        # Show a plot of the generated distribution
                        mainPanel(
                            plotOutput("distPlot")
                        )
                    )
                )
            )
        } else {}
    })



    output$distPlot <- renderPlot({
        x    <- faithful[, 2]
        bins <- seq(min(x), max(x), length.out = input$bins + 1)
        hist(x, breaks = bins, col = 'darkgray', border = 'white')
    })
}

# Run the application 
shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)

这是使其发挥作用的简单方法。您将reactiveValues作为条件输入传递给renderUI函数。

然而,这是一个非常危险的解决方案,因为密码和用户没有加密。对于使用 R Shiny 进行专业部署,请考虑 Shiny-Server 或我个人最喜欢的 ShinyProxy ( https://www.shinyproxy.io/ )