【问题标题】:Read in cookie to Shiny application with embedded javascript使用嵌入式 javascript 将 cookie 读入 Shiny 应用程序
【发布时间】:2016-06-03 21:04:50
【问题描述】:

我开始使用 Shiny 并喜欢它。但是,在我的 Shiny 应用程序中加入 javascript 以添加一些额外的功能时,我遇到了一个绊脚石。希望得到一些帮助。

这是一个非常基本的 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)
))   

“脚本”标签中包含的 javascript 函数 - 取自 quirksmode.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 的指针。

【问题讨论】:

  • 关于如何轻松地将 javascript 与闪亮集成的问题,您可能需要查看 shinyjs 包,特别是 extendShinyjs() 函数,它允许您从 R 调用自己的 javascript 函数。看看吧,也许有用

标签: javascript cookies shiny


【解决方案1】:

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。

【讨论】:

  • 感谢奥斯卡的帮助!
【解决方案2】:

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

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

代码是先前答案的一部分 How to access browser session/cookies from within Shiny App

【讨论】:

    猜你喜欢
    • 2016-10-30
    • 2017-09-30
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 2018-06-07
    相关资源
    最近更新 更多