178 lines
14 KiB
HTML
178 lines
14 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, shrink-to-fit=no">
|
|
<title>Helper functions for writing type safe functions for rserve-ts • ts</title>
|
|
<script src="deps/jquery-3.6.0/jquery-3.6.0.min.js"></script><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
|
<link href="deps/bootstrap-5.3.1/bootstrap.min.css" rel="stylesheet">
|
|
<script src="deps/bootstrap-5.3.1/bootstrap.bundle.min.js"></script><link href="deps/font-awesome-6.5.2/css/all.min.css" rel="stylesheet">
|
|
<link href="deps/font-awesome-6.5.2/css/v4-shims.min.css" rel="stylesheet">
|
|
<script src="deps/headroom-0.11.0/headroom.min.js"></script><script src="deps/headroom-0.11.0/jQuery.headroom.min.js"></script><script src="deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js"></script><script src="deps/clipboard.js-2.0.11/clipboard.min.js"></script><script src="deps/search-1.0.0/autocomplete.jquery.min.js"></script><script src="deps/search-1.0.0/fuse.min.js"></script><script src="deps/search-1.0.0/mark.min.js"></script><!-- pkgdown --><script src="pkgdown.js"></script><meta property="og:title" content="Helper functions for writing type safe functions for rserve-ts">
|
|
<meta name="description" content="A set of helper functions for writing type safe functions for writing and compiling typescript functions for use with rserve-ts.">
|
|
<meta property="og:description" content="A set of helper functions for writing type safe functions for writing and compiling typescript functions for use with rserve-ts.">
|
|
</head>
|
|
<body>
|
|
<a href="#main" class="visually-hidden-focusable">Skip to contents</a>
|
|
|
|
|
|
<nav class="navbar navbar-expand-lg fixed-top bg-light" data-bs-theme="light" aria-label="Site navigation"><div class="container">
|
|
|
|
<a class="navbar-brand me-2" href="index.html">ts</a>
|
|
|
|
<small class="nav-text text-muted me-auto" data-bs-toggle="tooltip" data-bs-placement="bottom" title="">0.1.0</small>
|
|
|
|
|
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbar" aria-controls="navbar" aria-expanded="false" aria-label="Toggle navigation">
|
|
<span class="navbar-toggler-icon"></span>
|
|
</button>
|
|
|
|
<div id="navbar" class="collapse navbar-collapse ms-3">
|
|
<ul class="navbar-nav me-auto">
|
|
<li class="nav-item"><a class="nav-link" href="reference/index.html">Reference</a></li>
|
|
<li class="nav-item dropdown">
|
|
<button class="nav-link dropdown-toggle" type="button" id="dropdown-articles" data-bs-toggle="dropdown" aria-expanded="false" aria-haspopup="true">Articles</button>
|
|
<ul class="dropdown-menu" aria-labelledby="dropdown-articles">
|
|
<li><a class="dropdown-item" href="articles/simple-react-app.html">Build a simple ReactJS app</a></li>
|
|
</ul>
|
|
</li>
|
|
<li class="nav-item"><a class="nav-link" href="news/index.html">Changelog</a></li>
|
|
</ul>
|
|
<ul class="navbar-nav">
|
|
<li class="nav-item"><form class="form-inline" role="search">
|
|
<input class="form-control" type="search" name="search-input" id="search-input" autocomplete="off" aria-label="Search site" placeholder="Search for" data-search-index="search.json">
|
|
</form></li>
|
|
</ul>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
</nav><div class="container template-home">
|
|
<div class="row">
|
|
<main id="main" class="col-md-9"><div class="section level1">
|
|
<div class="page-header"><h1 id="ts-write-apps-with-r-rserve-and-typescript">ts: Write apps with R, Rserve, and TypeScript<a class="anchor" aria-label="anchor" href="#ts-write-apps-with-r-rserve-and-typescript"></a>
|
|
</h1></div>
|
|
<!-- badges: start -->
|
|
|
|
<p>The <strong>ts</strong> package makes it easy for users to write functions that can be used in <a href="https://www.npmjs.com/package/rserve-ts" class="external-link"><strong>rserve-ts</strong></a> applications.</p>
|
|
<div class="section level2">
|
|
<h2 id="installation">Installation<a class="anchor" aria-label="anchor" href="#installation"></a>
|
|
</h2>
|
|
<p>You can install the development version of ts from <a href="https://github.com/" class="external-link">GitHub</a> with:</p>
|
|
<div class="sourceCode" id="cb1"><pre class="downlit sourceCode r">
|
|
<code class="sourceCode R"><span><span class="co"># install.packages("devtools")</span></span>
|
|
<span><span class="fu">devtools</span><span class="fu">::</span><span class="fu">install_github</span><span class="op">(</span><span class="st">"tmelliott/ts"</span><span class="op">)</span></span></code></pre></div>
|
|
</div>
|
|
<div class="section level2">
|
|
<h2 id="example">Example<a class="anchor" aria-label="anchor" href="#example"></a>
|
|
</h2>
|
|
<p>Writing functions is easy, just use the <code>ts_*()</code> functions to define formals and return types.</p>
|
|
<div class="sourceCode" id="cb2"><pre class="downlit sourceCode r">
|
|
<code class="sourceCode R"><span><span class="co"># demo.R</span></span>
|
|
<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="http://tomelliott.co.nz/ts/">ts</a></span><span class="op">)</span></span>
|
|
<span><span class="va">addFn</span> <span class="op"><-</span> <span class="fu"><a href="reference/ts_function.html">ts_function</a></span><span class="op">(</span></span>
|
|
<span> <span class="kw">function</span><span class="op">(</span><span class="va">a</span> <span class="op">=</span> <span class="fu"><a href="reference/ts_numeric.html">ts_numeric</a></span><span class="op">(</span><span class="fl">1</span><span class="op">)</span>, <span class="va">b</span> <span class="op">=</span> <span class="fu"><a href="reference/ts_numeric.html">ts_numeric</a></span><span class="op">(</span><span class="fl">1</span><span class="op">)</span><span class="op">)</span> <span class="va">a</span> <span class="op">+</span> <span class="va">b</span>,</span>
|
|
<span> result <span class="op">=</span> <span class="fu"><a href="reference/ts_numeric.html">ts_numeric</a></span><span class="op">(</span><span class="fl">1</span><span class="op">)</span></span>
|
|
<span><span class="op">)</span></span>
|
|
<span><span class="va">sampleFn</span> <span class="op"><-</span> <span class="fu"><a href="reference/ts_function.html">ts_function</a></span><span class="op">(</span></span>
|
|
<span> <span class="kw">function</span><span class="op">(</span><span class="va">x</span> <span class="op">=</span> <span class="fu"><a href="reference/ts_character.html">ts_character</a></span><span class="op">(</span><span class="op">)</span>, <span class="va">n</span> <span class="op">=</span> <span class="fu"><a href="reference/ts_integer.html">ts_integer</a></span><span class="op">(</span><span class="fl">1</span><span class="op">)</span><span class="op">)</span> <span class="fu"><a href="https://rdrr.io/r/base/sample.html" class="external-link">sample</a></span><span class="op">(</span><span class="va">x</span>, <span class="va">n</span><span class="op">)</span>,</span>
|
|
<span> result <span class="op">=</span> <span class="fu"><a href="reference/ts_character.html">ts_character</a></span><span class="op">(</span><span class="op">)</span></span>
|
|
<span><span class="op">)</span></span>
|
|
<span><span class="va">app</span> <span class="op"><-</span> <span class="fu"><a href="reference/ts_function.html">ts_function</a></span><span class="op">(</span></span>
|
|
<span> <span class="kw">function</span><span class="op">(</span><span class="op">)</span> <span class="op">{</span></span>
|
|
<span> <span class="fu"><a href="https://rdrr.io/r/base/list.html" class="external-link">list</a></span><span class="op">(</span></span>
|
|
<span> add <span class="op">=</span> <span class="va">addFn</span>,</span>
|
|
<span> sample <span class="op">=</span> <span class="va">sampleFn</span></span>
|
|
<span> <span class="op">)</span></span>
|
|
<span> <span class="op">}</span>,</span>
|
|
<span> result <span class="op">=</span> <span class="fu"><a href="reference/ts_list.html">ts_list</a></span><span class="op">(</span></span>
|
|
<span> add <span class="op">=</span> <span class="va">addFn</span>,</span>
|
|
<span> sample <span class="op">=</span> <span class="va">sampleFn</span></span>
|
|
<span> <span class="op">)</span></span>
|
|
<span><span class="op">)</span></span>
|
|
<span></span>
|
|
<span><span class="co"># TODO: specify exactly which functions to export in the entry point</span></span>
|
|
<span><span class="co"># ts_export(app)</span></span></code></pre></div>
|
|
<p>Then use <code><a href="reference/ts_compile.html">ts_compile()</a></code> to generate the TypeScript schemas:</p>
|
|
<div class="sourceCode" id="cb3"><pre class="sourceCode typescript"><code class="sourceCode typescript"><span id="cb3-1"><a href="#cb3-1" tabindex="-1"></a><span class="im">import</span> { Robj } <span class="im">from</span> <span class="st">'rserve-ts'</span><span class="op">;</span></span>
|
|
<span id="cb3-2"><a href="#cb3-2" tabindex="-1"></a><span class="im">import</span> { z } <span class="im">from</span> <span class="st">'zod'</span><span class="op">;</span></span>
|
|
<span id="cb3-3"><a href="#cb3-3" tabindex="-1"></a></span>
|
|
<span id="cb3-4"><a href="#cb3-4" tabindex="-1"></a><span class="kw">const</span> addFn <span class="op">=</span> Robj<span class="op">.</span><span class="fu">ocap</span>([z<span class="op">.</span><span class="fu">number</span>()<span class="op">,</span> z<span class="op">.</span><span class="fu">number</span>()]<span class="op">,</span> Robj<span class="op">.</span><span class="fu">numeric</span>(<span class="dv">1</span>))<span class="op">;</span></span>
|
|
<span id="cb3-5"><a href="#cb3-5" tabindex="-1"></a><span class="kw">const</span> app <span class="op">=</span> Robj<span class="op">.</span><span class="fu">ocap</span>([]<span class="op">,</span></span>
|
|
<span id="cb3-6"><a href="#cb3-6" tabindex="-1"></a> Robj<span class="op">.</span><span class="fu">list</span>({</span>
|
|
<span id="cb3-7"><a href="#cb3-7" tabindex="-1"></a> add<span class="op">:</span> Robj<span class="op">.</span><span class="fu">ocap</span>()<span class="op">,</span></span>
|
|
<span id="cb3-8"><a href="#cb3-8" tabindex="-1"></a> sample<span class="op">:</span> Robj<span class="op">.</span><span class="fu">ocap</span>()</span>
|
|
<span id="cb3-9"><a href="#cb3-9" tabindex="-1"></a> })</span>
|
|
<span id="cb3-10"><a href="#cb3-10" tabindex="-1"></a>)<span class="op">;</span></span>
|
|
<span id="cb3-11"><a href="#cb3-11" tabindex="-1"></a><span class="kw">const</span> sampleFn <span class="op">=</span> Robj<span class="op">.</span><span class="fu">ocap</span>(</span>
|
|
<span id="cb3-12"><a href="#cb3-12" tabindex="-1"></a> [z<span class="op">.</span><span class="fu">union</span>([z<span class="op">.</span><span class="fu">string</span>()<span class="op">,</span> z<span class="op">.</span><span class="fu">array</span>(z<span class="op">.</span><span class="fu">string</span>())])<span class="op">,</span> z<span class="op">.</span><span class="fu">number</span>()]<span class="op">,</span></span>
|
|
<span id="cb3-13"><a href="#cb3-13" tabindex="-1"></a> Robj<span class="op">.</span><span class="fu">character</span>()</span>
|
|
<span id="cb3-14"><a href="#cb3-14" tabindex="-1"></a>)<span class="op">;</span></span>
|
|
<span id="cb3-15"><a href="#cb3-15" tabindex="-1"></a></span>
|
|
<span id="cb3-16"><a href="#cb3-16" tabindex="-1"></a><span class="im">export</span> <span class="im">default</span> {</span>
|
|
<span id="cb3-17"><a href="#cb3-17" tabindex="-1"></a> addFn<span class="op">,</span></span>
|
|
<span id="cb3-18"><a href="#cb3-18" tabindex="-1"></a> app<span class="op">,</span></span>
|
|
<span id="cb3-19"><a href="#cb3-19" tabindex="-1"></a> sampleFn</span>
|
|
<span id="cb3-20"><a href="#cb3-20" tabindex="-1"></a>}<span class="op">;</span></span></code></pre></div>
|
|
<p>You can then import this into your <a href="https://www.npmjs.com/package/rserve-ts" class="external-link">rserve-ts</a> application. See <code>tests/testthat/sampler</code> for an example.</p>
|
|
<p>It is also possible to generate a sourceable file to deploy an Rserve instance with your app code using <code><a href="reference/ts_deploy.html">ts_deploy()</a></code>:</p>
|
|
<div class="sourceCode" id="cb4"><pre class="downlit sourceCode r">
|
|
<code class="sourceCode R"><span><span class="fu"><a href="reference/ts_deploy.html">ts_deploy</a></span><span class="op">(</span><span class="va">app</span><span class="op">)</span></span>
|
|
<span><span class="co"># run with: Rscript app.rserve.R</span></span></code></pre></div>
|
|
</div>
|
|
</div>
|
|
</main><aside class="col-md-3"><div class="license">
|
|
<h2 data-toc-skip>License</h2>
|
|
<ul class="list-unstyled">
|
|
<li><a href="LICENSE.html">Full license</a></li>
|
|
<li><small><a href="https://opensource.org/licenses/mit-license.php" class="external-link">MIT</a> + file <a href="LICENSE-text.html">LICENSE</a></small></li>
|
|
</ul>
|
|
</div>
|
|
|
|
|
|
<div class="citation">
|
|
<h2 data-toc-skip>Citation</h2>
|
|
<ul class="list-unstyled">
|
|
<li><a href="authors.html#citation">Citing ts</a></li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="developers">
|
|
<h2 data-toc-skip>Developers</h2>
|
|
<ul class="list-unstyled">
|
|
<li>Tom Elliott <br><small class="roles"> Author, maintainer </small> <a href="https://orcid.org/0000-0002-7815-6318" target="orcid.widget" aria-label="ORCID" class="external-link"><span class="fab fa-orcid orcid" aria-hidden="true"></span></a> </li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="dev-status">
|
|
<h2 data-toc-skip>Dev status</h2>
|
|
<ul class="list-unstyled">
|
|
<li><a href="https://github.com/tmelliott/ts/actions/workflows/R-CMD-check.yaml" class="external-link"><img src="https://github.com/tmelliott/ts/actions/workflows/R-CMD-check.yaml/badge.svg" alt="R-CMD-check"></a></li>
|
|
<li><a href="https://github.com/tmelliott/ts/actions/workflows/check-demo.yaml" class="external-link"><img src="https://github.com/tmelliott/ts/actions/workflows/check-demo.yaml/badge.svg" alt="Demo"></a></li>
|
|
</ul>
|
|
</div>
|
|
|
|
</aside>
|
|
</div>
|
|
|
|
|
|
<footer><div class="pkgdown-footer-left">
|
|
<p>Developed by Tom Elliott.</p>
|
|
</div>
|
|
|
|
<div class="pkgdown-footer-right">
|
|
<p>Site built with <a href="https://pkgdown.r-lib.org/" class="external-link">pkgdown</a> 2.1.1.</p>
|
|
</div>
|
|
|
|
</footer>
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
</body>
|
|
</html>
|