如何在 R/Shiny 中为每个用户仅显示一次(模态)弹出窗口?

How to show a (modal) popup only once per user in R/Shiny?

我喜欢在 R/Shiny 应用程序中显示一个弹出窗口,但每个用户只显示一次(有点像 GDPR cookie 横幅)。 shinyalert 看起来不错,但似乎不支持设置cookie只显示一次弹出窗口。我怎样才能轻松做到这一点?有没有不需要编写额外 JavaScript 函数的实现?

以下是您的操作方法。该演示使用名为“js-cookie”的 js 库,一个简单的 API 来获取和设置 cookie。无需使用额外的 R 包。

library(shiny)

ui <- fluidPage(
  HTML('<script src="https://cdn.jsdelivr.net/npm/js-cookie@rc/dist/js.cookie.min.js"></script>'),
  tags$script(HTML(
    '
    $(document).on("shiny:connected", function(){
      var newUser = Cookies.get("new_user");
      if(newUser === "false") return;
      Shiny.setInputValue("new_user", true);
      Cookies.set("new_user", false);
    });
    '
  ))
)

server <- function(input, output, session) {
  observeEvent(input$new_user, {
    req(input$new_user)
    showModal(modalDialog(
      easyClose = TRUE, footer = NULL,
      h1("Welcome new user!")
    ))
  })
  
}

shinyApp(ui, server)

如果 CDN 不工作,请使用 link 到 js-cookie github 下载并用您的本地副本替换脚本。

这里的技巧是将信息存储在浏览器的 cookie 中。每次用户访问时,先获取cookie,再决定是否显示模态。

此方法只会向每个用户显示一次模态,即使他们刷新浏览器,它也不会再次出现.

您需要打开 cookie 设置以清除当前 cookie 才能再次看到模态。这里我以Chrome为例。