Files
shiny/reference/reactive.html
2025-06-16 16:15:49 +00:00

192 lines
15 KiB
HTML

<!DOCTYPE html>
<!-- Generated by pkgdown: do not edit by hand --><html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Create a reactive expression — reactive • shiny</title><!-- jquery --><script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js" integrity="sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g==" crossorigin="anonymous" referrerpolicy="no-referrer"></script><!-- Bootstrap --><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha256-bZLfwXAP04zRMK2BjiO8iu9pf4FbLqX6zitd+tIvLhE=" crossorigin="anonymous"><script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha256-nuL8/2cJ5NDSSwnKD8VqreErSWHtnEP9E7AySL+1ev4=" crossorigin="anonymous"></script><!-- bootstrap-toc --><link rel="stylesheet" href="../bootstrap-toc.css"><script src="../bootstrap-toc.js"></script><!-- Font Awesome icons --><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css" integrity="sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=" crossorigin="anonymous"><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css" integrity="sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=" crossorigin="anonymous"><!-- clipboard.js --><script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js" integrity="sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=" crossorigin="anonymous"></script><!-- headroom.js --><script src="https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js" integrity="sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=" crossorigin="anonymous"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js" integrity="sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=" crossorigin="anonymous"></script><!-- pkgdown --><link href="../pkgdown.css" rel="stylesheet"><script src="../pkgdown.js"></script><meta property="og:title" content="Create a reactive expression — reactive"><meta property="og:description" content="Wraps a normal expression to create a reactive expression. Conceptually, a
reactive expression is a expression whose result will change over time."><meta property="og:image" content="/logo.png"><!-- mathjax --><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js" integrity="sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=" crossorigin="anonymous"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js" integrity="sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=" crossorigin="anonymous"></script><!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]--></head><body data-spy="scroll" data-target="#toc">
<div class="container template-reference-topic">
<header><div class="navbar navbar-default navbar-fixed-top" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<span class="navbar-brand">
<a class="navbar-link" href="../index.html">shiny</a>
<span class="version label label-default" data-toggle="tooltip" data-placement="bottom" title="">1.10.0.9001</span>
</span>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav"><li>
<a href="../reference/index.html">Reference</a>
</li>
<li>
<a href="../news/index.html">Changelog</a>
</li>
</ul><ul class="nav navbar-nav navbar-right"><li>
<a href="https://github.com/rstudio/shiny/" class="external-link">
<span class="fab fa-github fa-lg"></span>
</a>
</li>
</ul></div><!--/.nav-collapse -->
</div><!--/.container -->
</div><!--/.navbar -->
</header><div class="row">
<div class="col-md-9 contents">
<div class="page-header">
<h1>Create a reactive expression</h1>
<small class="dont-index">Source: <a href="https://github.com/rstudio/shiny/blob/main/R/reactives.R" class="external-link"><code>R/reactives.R</code></a></small>
<div class="hidden name"><code>reactive.Rd</code></div>
</div>
<div class="ref-description">
<p>Wraps a normal expression to create a reactive expression. Conceptually, a
reactive expression is a expression whose result will change over time.</p>
</div>
<div id="ref-usage">
<div class="sourceCode"><pre class="sourceCode r"><code><span><span class="fu">reactive</span><span class="op">(</span></span>
<span> <span class="va">x</span>,</span>
<span> env <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/sys.parent.html" class="external-link">parent.frame</a></span><span class="op">(</span><span class="op">)</span>,</span>
<span> quoted <span class="op">=</span> <span class="cn">FALSE</span>,</span>
<span> <span class="va">...</span>,</span>
<span> label <span class="op">=</span> <span class="cn">NULL</span>,</span>
<span> domain <span class="op">=</span> <span class="fu"><a href="domains.html">getDefaultReactiveDomain</a></span><span class="op">(</span><span class="op">)</span>,</span>
<span> ..stacktraceon <span class="op">=</span> <span class="cn">TRUE</span></span>
<span><span class="op">)</span></span>
<span></span>
<span><span class="fu">is.reactive</span><span class="op">(</span><span class="va">x</span><span class="op">)</span></span></code></pre></div>
</div>
<div id="arguments">
<h2>Arguments</h2>
<dl><dt id="arg-x">x<a class="anchor" aria-label="anchor" href="#arg-x"></a></dt>
<dd><p>For <code>is.reactive()</code>, an object to test. For <code>reactive()</code>, an
expression. When passing in a <code><a href="https://rlang.r-lib.org/reference/defusing-advanced.html" class="external-link">rlang::quo()</a></code>sure with <code>reactive()</code>,
remember to use <code><a href="https://rlang.r-lib.org/reference/inject.html" class="external-link">rlang::inject()</a></code> to distinguish that you are passing in
the content of your quosure, not the expression of the quosure.</p></dd>
<dt id="arg-env">env<a class="anchor" aria-label="anchor" href="#arg-env"></a></dt>
<dd><p>The parent environment for the reactive expression. By default,
this is the calling environment, the same as when defining an ordinary
non-reactive expression. If <code>x</code> is a quosure and <code>quoted</code> is <code>TRUE</code>,
then <code>env</code> is ignored.</p></dd>
<dt id="arg-quoted">quoted<a class="anchor" aria-label="anchor" href="#arg-quoted"></a></dt>
<dd><p>If it is <code>TRUE</code>, then the <code><a href="https://rdrr.io/r/base/substitute.html" class="external-link">quote()</a></code>ed value of <code>x</code>
will be used when <code>x</code> is evaluated. If <code>x</code> is a quosure and you
would like to use its expression as a value for <code>x</code>, then you must set
<code>quoted</code> to <code>TRUE</code>.</p></dd>
<dt id="arg--">...<a class="anchor" aria-label="anchor" href="#arg--"></a></dt>
<dd><p>Not used.</p></dd>
<dt id="arg-label">label<a class="anchor" aria-label="anchor" href="#arg-label"></a></dt>
<dd><p>A label for the reactive expression, useful for debugging.</p></dd>
<dt id="arg-domain">domain<a class="anchor" aria-label="anchor" href="#arg-domain"></a></dt>
<dd><p>See <a href="domains.html">domains</a>.</p></dd>
<dt id="arg--stacktraceon">..stacktraceon<a class="anchor" aria-label="anchor" href="#arg--stacktraceon"></a></dt>
<dd><p>Advanced use only. For stack manipulation purposes; see
<code><a href="stacktrace.html">stacktrace()</a></code>.</p></dd>
</dl></div>
<div id="value">
<h2>Value</h2>
<p>a function, wrapped in a S3 class "reactive"</p>
</div>
<div id="details">
<h2>Details</h2>
<p>Reactive expressions are expressions that can read reactive values and call
other reactive expressions. Whenever a reactive value changes, any reactive
expressions that depended on it are marked as "invalidated" and will
automatically re-execute if necessary. If a reactive expression is marked as
invalidated, any other reactive expressions that recently called it are also
marked as invalidated. In this way, invalidations ripple through the
expressions that depend on each other.</p>
<p>See the <a href="https://shiny.rstudio.com/tutorial/" class="external-link">Shiny tutorial</a> for
more information about reactive expressions.</p>
</div>
<div id="ref-examples">
<h2>Examples</h2>
<div class="sourceCode"><pre class="sourceCode r"><code><span class="r-in"><span><span class="kw"><a href="https://rdrr.io/r/base/library.html" class="external-link">library</a></span><span class="op">(</span><span class="va"><a href="https://rlang.r-lib.org" class="external-link">rlang</a></span><span class="op">)</span></span></span>
<span class="r-in"><span><span class="va">values</span> <span class="op">&lt;-</span> <span class="fu"><a href="reactiveValues.html">reactiveValues</a></span><span class="op">(</span>A<span class="op">=</span><span class="fl">1</span><span class="op">)</span></span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="va">reactiveB</span> <span class="op">&lt;-</span> <span class="fu">reactive</span><span class="op">(</span><span class="op">{</span></span></span>
<span class="r-in"><span> <span class="va">values</span><span class="op">$</span><span class="va">A</span> <span class="op">+</span> <span class="fl">1</span></span></span>
<span class="r-in"><span><span class="op">}</span><span class="op">)</span></span></span>
<span class="r-in"><span><span class="co"># View the values from the R console with isolate()</span></span></span>
<span class="r-in"><span><span class="fu"><a href="isolate.html">isolate</a></span><span class="op">(</span><span class="fu">reactiveB</span><span class="op">(</span><span class="op">)</span><span class="op">)</span></span></span>
<span class="r-out co"><span class="r-pr">#&gt;</span> [1] 2</span>
<span class="r-in"><span><span class="co"># 2</span></span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># To store expressions for later conversion to reactive, use quote()</span></span></span>
<span class="r-in"><span><span class="va">myquo</span> <span class="op">&lt;-</span> <span class="fu">rlang</span><span class="fu">::</span><span class="fu"><a href="https://rlang.r-lib.org/reference/defusing-advanced.html" class="external-link">quo</a></span><span class="op">(</span><span class="va">values</span><span class="op">$</span><span class="va">A</span> <span class="op">+</span> <span class="fl">2</span><span class="op">)</span></span></span>
<span class="r-in"><span><span class="co"># Unexpected value! Sending a quosure directly will not work as expected.</span></span></span>
<span class="r-in"><span><span class="va">reactiveC</span> <span class="op">&lt;-</span> <span class="fu">reactive</span><span class="op">(</span><span class="va">myquo</span><span class="op">)</span></span></span>
<span class="r-in"><span><span class="co"># We'd hope for `3`, but instead we get the quosure that was supplied.</span></span></span>
<span class="r-in"><span><span class="fu"><a href="isolate.html">isolate</a></span><span class="op">(</span><span class="fu">reactiveC</span><span class="op">(</span><span class="op">)</span><span class="op">)</span></span></span>
<span class="r-out co"><span class="r-pr">#&gt;</span> <span style="font-weight: bold;">&lt;quosure&gt;</span></span>
<span class="r-out co"><span class="r-pr">#&gt;</span> expr: <span style="color: #0000BB;">^values$A + 2</span></span>
<span class="r-out co"><span class="r-pr">#&gt;</span> env: <span style="color: #0000BB;">0x55f668933a40</span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># Instead, the quosure should be `rlang::inject()`ed</span></span></span>
<span class="r-in"><span><span class="va">reactiveD</span> <span class="op">&lt;-</span> <span class="fu">rlang</span><span class="fu">::</span><span class="fu"><a href="https://rlang.r-lib.org/reference/inject.html" class="external-link">inject</a></span><span class="op">(</span><span class="fu">reactive</span><span class="op">(</span><span class="op">!</span><span class="op">!</span><span class="va">myquo</span><span class="op">)</span><span class="op">)</span></span></span>
<span class="r-in"><span><span class="fu"><a href="isolate.html">isolate</a></span><span class="op">(</span><span class="fu">reactiveD</span><span class="op">(</span><span class="op">)</span><span class="op">)</span></span></span>
<span class="r-out co"><span class="r-pr">#&gt;</span> [1] 3</span>
<span class="r-in"><span><span class="co"># 3</span></span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># (Legacy) Can use quoted expressions</span></span></span>
<span class="r-in"><span><span class="va">expr</span> <span class="op">&lt;-</span> <span class="fu"><a href="https://rdrr.io/r/base/substitute.html" class="external-link">quote</a></span><span class="op">(</span><span class="op">{</span> <span class="va">values</span><span class="op">$</span><span class="va">A</span> <span class="op">+</span> <span class="fl">3</span> <span class="op">}</span><span class="op">)</span></span></span>
<span class="r-in"><span><span class="va">reactiveE</span> <span class="op">&lt;-</span> <span class="fu">reactive</span><span class="op">(</span><span class="va">expr</span>, quoted <span class="op">=</span> <span class="cn">TRUE</span><span class="op">)</span></span></span>
<span class="r-in"><span><span class="fu"><a href="isolate.html">isolate</a></span><span class="op">(</span><span class="fu">reactiveE</span><span class="op">(</span><span class="op">)</span><span class="op">)</span></span></span>
<span class="r-out co"><span class="r-pr">#&gt;</span> [1] 4</span>
<span class="r-in"><span><span class="co"># 4</span></span></span>
<span class="r-in"><span></span></span>
</code></pre></div>
</div>
</div>
<div class="col-md-3 hidden-xs hidden-sm" id="pkgdown-sidebar">
<nav id="toc" data-toggle="toc" class="sticky-top"><h2 data-toc-skip>Contents</h2>
</nav></div>
</div>
<footer><div class="copyright">
<p></p><p>Developed by Winston Chang, Joe Cheng, JJ Allaire, Carson Sievert, Barret Schloerke, Yihui Xie, Jeff Allen, Jonathan McPherson, Alan Dipert, Barbara Borges, Posit Software, PBC.</p>
</div>
<div class="pkgdown">
<p></p><p>Site built with <a href="https://pkgdown.r-lib.org/" class="external-link">pkgdown</a> 2.1.3.</p>
</div>
</footer></div>
</body></html>