In many instances, you will want to send data from the R server to the JS client. Here is a very simple example:
library(shiny)
runApp(
list(
ui = fluidPage(
tags$script(
"Shiny.addCustomMessageHandler('message', function(params) { alert(params); });"
),
actionButton("btn","Press Me")
),
server = function(input, output, session) {
observeEvent(input$btn,{
randomNumber <- runif(1,0,100)
session$sendCustomMessage("message",list(paste0(randomNumber," is a random number!")))
})
}
)
)
The workhorses here are the session$sendCustomMessage function in R and the Shiny.addCustomMessageHandler function in javascript.
The session$sendCustomMessage function lets you send parameters from R to a javascript function, and Shiny.addCustomMessageHandler let's you define the javascript function that accepts the parameters from R.
Note: Lists are converted to JSON when they are passed from R to javascript
In some instances, you will want to send data from JS client to the R server. Here is a basic example using javascript's Shiny.onInputChange function:
library(shiny)
runApp(
list(
ui = fluidPage(
# create password input
HTML('<input type="password" id="passwordInput">'),
# use jquery to write function that sends value to
# server when changed
tags$script(
'$("#passwordInput").on("change",function() {
Shiny.onInputChange("myInput",this.value);
})'
),
# show password
verbatimTextOutput("test")
),
server = function(input, output, session) {
# read in then show password
output$test <- renderPrint(
input$myInput
)
}
)
)
Here we create a password input with id passwordInput. We add a Javascript function on the UI that reacts to changes in passwordInput, and sends the value to the server using Shiny.onInputChange.
Shiny.onInputChange takes two parameters, a name for the input$*name*, plus a value for input$*name*
Then you can use input$*name* like any other Shiny input.