8

I want to get screen resolution from JavaScript, stored in the GetScreenWidth variable on Shiny Server.

I tried the reference:

  1. Receiving data from .js in server.R shiny
  2. https://ryouready.wordpress.com/2013/11/20/sending-data-from-client-to-server-and-back-using-shiny/

So I have:

ui.R

shinyUI(
  bootstrapPage(

    verbatimTextOutput("results")
    ,tags$script('
        var jsWidth = screen.width;
        Shiny.onInputChange("GetScreenWidth",jsWidth);
    ')
   )
 )

server.R

 shinyServer(function(input,output){

     output$results=renderPrint({
     input$GetScreenWidth
   })

 })

It will return NULL by verbatimTextOutput.

How should I modify the code? Thanks!

Badacadabra
  • 8,043
  • 7
  • 28
  • 49
Robin Chen
  • 103
  • 3

1 Answers1

11

The problem is that you're running the JavaScript code before Shiny is initialized. You can use the new feature that tells you when shiny is ready, here's example code

jscode <-
'$(document).on("shiny:connected", function(e) {
  var jsWidth = screen.width;
  Shiny.onInputChange("GetScreenWidth",jsWidth);
});
'

library(shiny)
runApp(shinyApp(
  ui = fluidPage(
    tags$script(jscode)
  ),
  server = function(input, output, session) {
    observe({
      cat(input$GetScreenWidth)
    })
  }
))
DeanAttali
  • 25,268
  • 10
  • 92
  • 118