使用嵌入式javascript读取cookie到Shiny应用程序

Read in cookie to Shiny application with embedded javascript

本文关键字:Shiny 应用程序 cookie 读取 嵌入式 javascript      更新时间:2023-09-26

我刚开始使用Shiny,并且很喜欢它。但在将javascript集成到我的Shiny应用程序中以添加一些附加功能时,我遇到了一个障碍。希望得到一些帮助。

这里有一个非常基本的Shiny应用程序,我正在使用它来测试用javascript在浏览器cookie中读取的可行性,以便可以在ui中访问它。R.

ui。R代码。

# UI file of getCookie Shiny application.
shinyUI(fluidPage(
        titlePanel('Cookie'),
        cookie <- tags$head(tags$script(src='readCookie.js')),
        print(cookie)
))   

"script"标记中包含的javascript函数取自quicksmode.org/js/cookies.html.

function readCookie() {
        name = "raisinCookie";
        var nameEQ = name + "=";
        var ca = document.cookie.split(';');
        for(var i=0;i < ca.length;i++) {
                var c = ca[i];
                while (c.charAt(0)==' ') c = c.substring(1,c.length);
                if (c.indexOf(nameEQ) == 0) return      c.substring(nameEQ.length,c.length);
        }   
        return null;
}

以及服务器代码。

# Server file of getCookie Shiny application. 
shinyServer(function(input, output){
})

首先,我应该问一下,是否有可能在闪亮的应用程序中读取cookie?第二,我在这里走对了吗?第三,假设我的js代码工作正常,我如何访问js函数在其源代码中返回的值?

任何和所有的帮助都值得赞赏,建设性的批评也是如此。我是新手,所以欢迎任何有助于整合Shiny和JS的建议。

Shinyjs可能就是这样做的方法。

以下是如何在不使用shinyjs:的情况下读取cookie

# UI file of getCookie Shiny application.
ui <- shinyUI(fluidPage(
  titlePanel('Cookie'),
  tags$head(tags$script(
    HTML('
      Shiny.addCustomMessageHandler ("readCookie",function (message) {
        var cookie = readCookie(message.name);
        Shiny.onInputChange("cookie", cookie);
      })
      function readCookie(name) {
        var nameEQ = name + "=";
        var ca = document.cookie.split(";");
        for(var i=0;i < ca.length;i++) {
                var c = ca[i];
                while (c.charAt(0)==" ") c = c.substring(1,c.length);
                if (c.indexOf(nameEQ) == 0) return      c.substring(nameEQ.length,c.length);
        }   
        return "No such cookie";
      }   
      ')
    )),
  sidebarPanel(
    actionButton('readCookie','Get Cookie'),
    textInput('cookieName','Name of cookie: ')
    ),
  mainPanel(
    textOutput('cookieVal')
  )
)) 
# Server file of getCookie Shiny application. 
server <- shinyServer(function(input, output,session){
  observeEvent(input$readCookie,{
    session$sendCustomMessage(type="readCookie",
                              message=list(name=input$cookieName))
  })
  observeEvent(input$cookie,{
    output$cookieVal <- renderPrint({ input$cookie })
  })
})
shinyApp(ui=ui, server=server)

运行

document.cookie="username=John Doe";

在浏览器控制台中创建cookie。

这是一个如何使用js.cookies.js库检索所有cookie的示例应用程序

https://beta.rstudioconnect.com/iwallace/cookies/

该代码是上一个答案的一部分如何从Shiny App 中访问浏览器会话/cookie