| createRenderFunction {shiny} | R Documentation |
Implement custom render functions
Description
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).
Usage
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
)
Arguments
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
|
Details
To implement a custom renderXXX() function, essentially 2 things are needed:
Capture the user's reactive expression as a function.
New
renderXXX()functions can usequoToFunction()for this, but already existingrenderXXX()functions that containenvandquotedparameters may want to continue usinginstallExprFunction()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 ofmarkRenderFunction()) for this step (see examples).
-
Value
An annotated render function, ready to be assigned to an
output slot.
Functions
-
quoToFunction(): convert a quosure to a function. -
installExprFunction(): converts a user's reactiveexprinto a function that's assigned to anamein theassign.env.
Examples
# 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)