13

How can I access cookies and other browser-related session data from within a Shiny app?

With session$clientData, we are able to get other client details like host,port,query param...

Is there any other way to get cookies in shiny app?

sag
  • 5,333
  • 8
  • 54
  • 91
  • You can get it on the javascript side and use `Shiny.onInputChange` to pass it back into Shiny – DeanAttali Sep 03 '15 at 06:08
  • Is it not possible without javascript? – sag Sep 03 '15 at 06:28
  • 1
    Maybe, but not that i know of – DeanAttali Sep 03 '15 at 15:28
  • 3
    Maybe this could help : `session$request$HTTP_COOKIE`. As @daatali said, Shiny has some functions for this : js to server : `Shiny.onInputChange(id,data)` ; server to js : `session$sendCustomMessage(id,data)`; js handler : `Shiny.addCustomMessageHandler(id,function)` ; – fxi Dec 29 '15 at 17:10
  • 2
    `Shiny-Server` seems to drop some http headers. This is not a good idea, `session$request$HTTP_COOKIE` will be NULL. https://groups.google.com/d/msg/shiny-discuss/nHFbL0K38k8/FndeYifoAwAJ – fxi Feb 12 '16 at 08:41

1 Answers1

8

To build on the great comments, you can use the js.cookie.js package with the Shiny.OnInputChange() function to return cookies.

An example app is here: https://beta.rstudioconnect.com/iwallace/cookies/

--ui.r--

library(shiny)
library(shinydashboard)

fluidPage(
tags$head(tags$script(src="js.cookie.js")),
# a shiny element to display unformatted text
box(title ="click the gray square to view cookies!",    verbatimTextOutput("results"),actionButton("go","click me")),

# javascript code to send data to shiny server
tags$script('
          document.getElementById("go").onclick = function() {
          var number = Math.random();

          Cookies.set(\'name\', \'value\', { expires: 7 });
          Cookies.set(\'cookie_2\', \'value\', { expires: 7 });

          var my_cookie = Cookies.get(); 

          Shiny.onInputChange("mydata", my_cookie);
          };
          ')

)

--server.r--

library(shiny)

shinyServer(function(input, output,session) {
output$results = renderPrint({
input$mydata
})

})
alko989
  • 7,688
  • 5
  • 39
  • 62
Iain
  • 1,608
  • 4
  • 22
  • 27