View source: R/shinywrappers.R
createRenderFunction | R Documentation |
Developer-facing utilities for implementing a custom renderXXX()
function.
Before using these utilities directly, consider using the htmlwidgets
package to implement custom
outputs (i.e., custom renderXXX()
/xxxOutput()
functions). That said,
these utilities can be used more directly if a full-blown htmlwidget isn't
needed and/or the user-supplied reactive expression needs to be wrapped in
additional call(s).
createRenderFunction(
func,
transform = function(value, session, name, ...) value,
outputFunc = NULL,
outputArgs = NULL,
cacheHint = "auto",
cacheWriteHook = NULL,
cacheReadHook = NULL
)
quoToFunction(q, label = sys.call(-1)[[1]], ..stacktraceon = FALSE)
installExprFunction(
expr,
name,
eval.env = parent.frame(2),
quoted = FALSE,
assign.env = parent.frame(1),
label = sys.call(-1)[[1]],
wrappedWithLabel = TRUE,
..stacktraceon = FALSE
)
func |
A function without parameters, that returns user data. If the returned value is a promise, then the render function will proceed in async mode. |
transform |
A function that takes four arguments: |
outputFunc |
The UI function that is used (or most commonly used) with this render function. This can be used in R Markdown documents to create complete output widgets out of just the render function. |
outputArgs |
A list of arguments to pass to the |
cacheHint |
One of |
cacheWriteHook |
Used if the render function is passed to |
cacheReadHook |
Used if the render function is passed to |
q |
Quosure of the expression |
label |
A label for the object to be shown in the debugger. Defaults to the name of the calling function. |
expr |
A quoted or unquoted expression, or a quosure. |
name |
The name the function should be given |
eval.env |
The desired environment for the function. Defaults to the calling environment two steps back. |
quoted |
Is the expression quoted? |
assign.env |
The environment in which the function should be assigned. |
wrappedWithLabel , ..stacktraceon |
Advanced use only. For stack manipulation purposes; see
|
To implement a custom renderXXX()
function, essentially 2 things are needed:
Capture the user's reactive expression as a function.
New renderXXX()
functions can use quoToFunction()
for this, but
already existing renderXXX()
functions that contain env
and quoted
parameters may want to continue using installExprFunction()
for better
legacy support (see examples).
Flag the resulting function (from 1) as a Shiny rendering function and also provide a UI container for displaying the result of the rendering function.
createRenderFunction()
is currently recommended (instead of
markRenderFunction()
) for this step (see examples).
An annotated render function, ready to be assigned to an
output
slot.
quoToFunction()
: convert a quosure to a function.
installExprFunction()
: converts a user's reactive expr
into a
function that's assigned to a name
in the assign.env
.
# A custom render function that repeats the supplied value 3 times
renderTriple <- function(expr) {
# Wrap user-supplied reactive expression into a function
func <- quoToFunction(rlang::enquo0(expr))
createRenderFunction(
func,
transform = function(value, session, name, ...) {
paste(rep(value, 3), collapse=", ")
},
outputFunc = textOutput
)
}
# For better legacy support, consider using installExprFunction() over quoToFunction()
renderTripleLegacy <- function(expr, env = parent.frame(), quoted = FALSE) {
func <- installExprFunction(expr, "func", env, quoted)
createRenderFunction(
func,
transform = function(value, session, name, ...) {
paste(rep(value, 3), collapse=", ")
},
outputFunc = textOutput
)
}
# Test render function from the console
reactiveConsole(TRUE)
v <- reactiveVal("basic")
r <- renderTriple({ v() })
r()
#> [1] "basic, basic, basic"
# User can supply quoted code via rlang::quo(). Note that evaluation of the
# expression happens when r2() is invoked, not when r2 is created.
q <- rlang::quo({ v() })
r2 <- rlang::inject(renderTriple(!!q))
v("rlang")
r2()
#> [1] "rlang, rlang, rlang"
# Supplying quoted code without rlang::quo() requires installExprFunction()
expr <- quote({ v() })
r3 <- renderTripleLegacy(expr, quoted = TRUE)
v("legacy")
r3()
#> [1] "legacy, legacy, legacy"
# The legacy approach also supports with quosures (env is ignored in this case)
q <- rlang::quo({ v() })
r4 <- renderTripleLegacy(q, quoted = TRUE)
v("legacy-rlang")
r4()
#> [1] "legacy-rlang, legacy-rlang, legacy-rlang"
# Turn off reactivity in the console
reactiveConsole(FALSE)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.