With a JavaScript handler, once you have calculated a value based on the handler's arguments (e.g. name, value) you will likely want to produce a side-effect based on that calculated value. This function helps you do that.

vw_handler_add_effect(vw_handler, body_effect, ...)



vw_handler created using vw_handler_signal() or vw_handler_event()


character, the name of a defined handler-body, or the text of the body of a handler-function


additional named parameters to be interpolated into the text of the handler_body


modified copy of vw_handler


The calculation of a value is meant to be separate from the production of a side-effect. This way, the code for a side-effect can be used for any type of handler.

You are supplying the body_effect to an effect-handler. This takes a single argument, x, representing the calculated value. Doing this allows us to chain side-effects together; be careful not to modify x in any of the code you provide.

To see what side-effects are available in this package's handler-library, call vw_handler_add_effect() without any arguments. You may notice that some of the effects, like "element_text", require additional parameters, in this case, selector.

Those parameters with a default value of NULL require you to supply a value; those with sensible defaults are optional.

To provide the parameters, call vw_handler_add_effect() with named arguments corresponding to the names of the parameters. See the examples for details.


  # list all the available effect-handlers
#> arguments: x 
#>   body_effect: shiny_input 
#>     params: inputId = NULL, expr = "x" 
#>     // sets the Shiny-input named `inputId` to `expr` (default "x")
#>     Shiny.setInputValue('${inputId}', ${expr});
#>   body_effect: console 
#>     params: label = "", expr = "x" 
#>     // if `label` is non-trivial, prints it to the JS console
#>     '${label}'.length > 0 ? console.log('${label}') : null;
#>     // prints `expr` (default "x") to the JS console
#>     console.log(${expr});
#>   body_effect: element_text 
#>     params: selector = NULL, expr = "x" 
#>     // to element `selector`, adds text `expr` (default "x")
#>     document.querySelector('${selector}').innerText = ${expr}

  # build a signal handler that prints some text,
  # then the value, to the console
  vw_handler_signal("value") %>%
    vw_handler_add_effect("console", label = "signal value:")
#> arguments: name, value 
#> body_value:
#>   // returns the value of the signal
#>   return value;
#> body_effect:
#>   // if `label` is non-trivial, prints it to the JS console
#>   'signal value:'.length > 0 ? console.log('signal value:') : null;
#>   // prints `expr` (default "x") to the JS console
#>   console.log(x);