EVOLUTION-MANAGER
Edit File: embed.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="generator" content="pandoc" /> <meta http-equiv="X-UA-Compatible" content="IE=EDGE" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="author" content="Brodie Gaslam" /> <title>Embed Diffs in R Markdown Or Shiny</title> <style type="text/css"> code{white-space: pre-wrap;} span.smallcaps{font-variant: small-caps;} span.underline{text-decoration: underline;} div.column{display: inline-block; vertical-align: top; width: 50%;} div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;} ul.task-list{list-style: none;} </style> <style type="text/css"> code { white-space: pre; } .sourceCode { overflow: visible; } </style> <style type="text/css" data-origin="pandoc"> a.sourceLine { display: inline-block; line-height: 1.25; } a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; } a.sourceLine:empty { height: 1.2em; position: absolute; } .sourceCode { overflow: visible; } code.sourceCode { white-space: pre; position: relative; } div.sourceCode { margin: 1em 0; } pre.sourceCode { margin: 0; } @media screen { div.sourceCode { overflow: auto; } } @media print { code.sourceCode { white-space: pre-wrap; } a.sourceLine { text-indent: -1em; padding-left: 1em; } } pre.numberSource a.sourceLine { position: relative; } pre.numberSource a.sourceLine:empty { position: absolute; } pre.numberSource a.sourceLine::before { content: attr(data-line-number); position: absolute; left: -5em; text-align: right; vertical-align: baseline; border: none; pointer-events: all; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; padding: 0 4px; width: 4em; color: #aaaaaa; } pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; } div.sourceCode { } @media screen { a.sourceLine::before { text-decoration: underline; } } code span.al { color: #ff0000; font-weight: bold; } /* Alert */ code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */ code span.at { color: #7d9029; } /* Attribute */ code span.bn { color: #40a070; } /* BaseN */ code span.bu { } /* BuiltIn */ code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */ code span.ch { color: #4070a0; } /* Char */ code span.cn { color: #880000; } /* Constant */ code span.co { color: #60a0b0; font-style: italic; } /* Comment */ code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */ code span.do { color: #ba2121; font-style: italic; } /* Documentation */ code span.dt { color: #902000; } /* DataType */ code span.dv { color: #40a070; } /* DecVal */ code span.er { color: #ff0000; font-weight: bold; } /* Error */ code span.ex { } /* Extension */ code span.fl { color: #40a070; } /* Float */ code span.fu { color: #06287e; } /* Function */ code span.im { } /* Import */ code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */ code span.kw { color: #007020; font-weight: bold; } /* Keyword */ code span.op { color: #666666; } /* Operator */ code span.ot { color: #007020; } /* Other */ code span.pp { color: #bc7a00; } /* Preprocessor */ code span.sc { color: #4070a0; } /* SpecialChar */ code span.ss { color: #bb6688; } /* SpecialString */ code span.st { color: #4070a0; } /* String */ code span.va { color: #19177c; } /* Variable */ code span.vs { color: #4070a0; } /* VerbatimString */ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */ </style> <script> // apply pandoc div.sourceCode style to pre.sourceCode instead (function() { var sheets = document.styleSheets; for (var i = 0; i < sheets.length; i++) { if (sheets[i].ownerNode.dataset["origin"] !== "pandoc") continue; try { var rules = sheets[i].cssRules; } catch (e) { continue; } for (var j = 0; j < rules.length; j++) { var rule = rules[j]; // check if there is a div.sourceCode rule if (rule.type !== rule.STYLE_RULE || rule.selectorText !== "div.sourceCode") continue; var style = rule.style.cssText; // check if color or background-color is set if (rule.style.color === '' && rule.style.backgroundColor === '') continue; // replace div.sourceCode by a pre.sourceCode rule sheets[i].deleteRule(j); sheets[i].insertRule('pre.sourceCode{' + style + '}', j); } } })(); </script> <style type="text/css"> DIV.diffobj-container PRE.diffobj-content { white-space: pre-wrap; margin: 0; } DIV.diffobj-container DIV.diffobj-row { width: 100%; font-family: monospace; display: table; table-layout: fixed; } DIV.diffobj-container DIV.diffobj-line { width: auto; display: table-cell; overflow: hidden; } DIV.diffobj-container DIV.diffobj-line>DIV { width: 100%; display: table; table-layout: auto; } DIV.diffobj-container DIV.diffobj-line.banner>DIV { display: table; table-layout: auto; } DIV.diffobj-container DIV.diffobj-text { display: table-cell; width: 100%; } DIV.diffobj-container DIV.diffobj-gutter { display: table-cell; padding: 0 0.2em; } DIV.diffobj-container DIV.diffobj-gutter DIV { display: table-cell; } #diffobj_content_meta DIV.diffobj-container DIV.diffobj-row { width: auto; } #diffobj_banner_meta DIV.diffobj-container DIV.diffobj-line.banner>DIV { table-layout: auto; } #diffobj_outer { overflow: hidden; } DIV.diffobj-container DIV.diffobj-summary DIV.map { word-wrap: break-word; padding-left: 1em; } DIV.diffobj-container DIV.diffobj-summary DIV.detail { padding-left: 1em; } DIV.diffobj-container DIV.diffobj-line.banner { font-size: 1.2em; font-weight: bold; overflow: hidden; } DIV.diffobj-container DIV.diffobj-line.banner DIV.diffobj-text DIV{ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; width: 100%; } DIV.diffobj-container DIV.diffobj-gutter, DIV.diffobj-container DIV.diffobj-guide, DIV.diffobj-container DIV.diffobj-fill, DIV.diffobj-container DIV.context_sep, DIV.diffobj-container SPAN.diffobj-trim { color: #999; } DIV.diffobj-container DIV.diffobj-header { font-size: 1.1em; } DIV.diffobj-container DIV.diffobj-text>DIV.diffobj-match, DIV.diffobj-container DIV.diffobj-text>DIV.diffobj-guide { background-color: #ffffff; } DIV.diffobj-container DIV.diffobj-text>DIV.diffobj-fill { background-color: transparent; } DIV.diffobj-container DIV.diffobj-text>DIV { padding-right: 3px; } DIV.diffobj-container DIV.diffobj-text>DIV { border-left: 1px solid #888888; } DIV.diffobj-container DIV.diffobj-line { background-color: #eeeeee; } DIV.diffobj-container DIV.diffobj-text>DIV, DIV.diffobj-container DIV.diffobj-header { padding-left: 0.5em; } DIV.diffobj-container DIV.diffobj-line>DIV.diffobj-match, DIV.diffobj-container DIV.diffobj-line>DIV.diffobj-fill, DIV.diffobj-container DIV.diffobj-line>DIV.diffobj-guide { border-left: 1px solid #888888; } DIV.diffobj-container.light.rgb SPAN.diffobj-word.insert, DIV.diffobj-container.light.rgb DIV.diffobj-line>DIV.insert { background-color: #a6f3a6; } DIV.diffobj-container.light.rgb SPAN.diffobj-word.delete, DIV.diffobj-container.light.rgb DIV.diffobj-line>DIV.delete { background-color: #f8c2c2; } DIV.diffobj-container.light.rgb DIV.diffobj-text>DIV.insert { background-color: #efffef; } DIV.diffobj-container.light.rgb DIV.diffobj-text>DIV.insert, DIV.diffobj-container.light.rgb DIV.diffobj-line>DIV.insert { border-left: 1px solid #33bb33; } DIV.diffobj-container.light.rgb DIV.diffobj-text>DIV.delete { background-color: #ffefef; } DIV.diffobj-container.light.rgb DIV.diffobj-text>DIV.delete, DIV.diffobj-container.light.rgb DIV.diffobj-line>DIV.delete { border-left: 1px solid #cc6666; } DIV.diffobj-container.light.rgb DIV.diffobj-header { background-color: #e0e6fa; border-left: 1px solid #9894b6; } DIV.diffobj-container.light.yb SPAN.diffobj-word.insert, DIV.diffobj-container.light.yb DIV.diffobj-line>DIV.insert { background-color: #c0cfff; } DIV.diffobj-container.light.yb SPAN.diffobj-word.delete, DIV.diffobj-container.light.yb DIV.diffobj-line>DIV.delete { background-color: #e7e780; } DIV.diffobj-container.light.yb DIV.diffobj-text>DIV.insert { background-color: #efefff; } DIV.diffobj-container.light.yb DIV.diffobj-text>DIV.insert, DIV.diffobj-container.light.yb DIV.diffobj-line>DIV.insert { border-left: 1px solid #3333bb; } DIV.diffobj-container.light.yb DIV.diffobj-text>DIV.delete { background-color: #fefee5; } DIV.diffobj-container.light.yb DIV.diffobj-text>DIV.delete, DIV.diffobj-container.light.yb DIV.diffobj-line>DIV.delete { border-left: 1px solid #aaaa55; } DIV.diffobj-container.light.yb DIV.diffobj-header { background-color: #afafaf; border-left: 1px solid #e3e3e3; color: #e9e9e9; } DIV.diffobj-container.light.yb DIV.diffobj-line { background-color: #eeeeee; } </style> <style type="text/css"> body { background-color: #fff; margin: 1em auto; max-width: 700px; overflow: visible; padding-left: 2em; padding-right: 2em; font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1.5; } #header { text-align: center; } #TOC { clear: both; padding: 4px; width: 100%; border: 1px solid #CCCCCC; border-radius: 5px; background-color: #f6f6f6; font-size: 13px; line-height: 1.3; } #TOC .toctitle { font-weight: bold; font-size: 15px; margin-left: 5px; } #TOC ul { padding-left: 40px; margin-left: -1.5em; margin-top: 5px; margin-bottom: 5px; } #TOC ul ul { margin-left: -2em; } #TOC li { line-height: 16px; } table { margin: 1em auto; border-width: 1px; border-color: #DDDDDD; border-style: outset; border-collapse: collapse; } table th { border-width: 2px; padding: 5px; border-style: inset; } table td { border-width: 1px; border-style: inset; line-height: 18px; padding: 5px 5px; } table, table th, table td { border-left-style: none; border-right-style: none; } table thead, table tr.even { background-color: #f7f7f7; } p { margin: 1em 0; } blockquote { background-color: #f6f6f6; padding: 0.25em 0.75em; } hr { border-style: solid; border: none; border-top: 1px solid #777; margin: 28px 0; } dl { margin-left: 0; } dl dd { margin-bottom: 13px; margin-left: 13px; } dl dt { font-weight: bold; } ul { margin-top: 0; } ul li { list-style: circle outside; } ul ul { margin-bottom: 0; } h3.subtitle { margin-top: -23px; } pre, code { background-color: #EEE; color: #333; } pre { border: 2px solid #EEE; overflow: auto; white-space: pre-wrap; margin: 5px 0px; padding: 5px 10px; font-size: 85%; } pre:not([class]) { color: #353; } div.sourceCode pre, div.sourceCode code { background-color: #FAFAFA; } div.sourceCode pre{ } div.sourceCode + pre, div.sourceCode + div.diffobj-container { margin-top: -5px; } div.diffobj-container pre.diffobj-content { line-height: 1.3; } code { font-family: Consolas, Monaco, 'Courier New', monospace; } p > code, li > code, h1 > code, h2 > code, h3 > code, h4 > code, h5 > code, h6 > code { padding: 2px 0px; line-height: 1; font-weight: bold; } div.figure { text-align: center; } img { background-color: #FFFFFF; padding: 2px; border: 1px solid #DDDDDD; border-radius: 3px; border: 1px solid #CCCCCC; margin: 0 5px; } h1 { margin-top: 0; padding-bottom: 3px; font-size: 35px; line-height: 40px; border-bottom: 1px solid #999; } h2 { border-bottom: 1px solid #999; padding-top: 5px; padding-bottom: 2px; font-size: 145%; } h3 { padding-top: 5px; font-size: 120%; } h4 { color: #777; font-size: 105%; } h4.author, h4.date {display: none;} h5, h6 { font-size: 105%; } a { color: #2255dd; font-weight: bold; text-decoration: none; } a:hover { color: #6666ff; } a:visited { color: #800080; } a:visited:hover { color: #BB00BB; } a[href^="http:"] { text-decoration: underline; } a[href^="https:"] { text-decoration: underline; } code > span.kw { color: #555; font-weight: bold; } code > span.dt { color: #902000; } code > span.dv { color: #40a070; } code > span.bn { color: #d14; } code > span.fl { color: #d14; } code > span.ch { color: #d14; } code > span.st { color: #d14; } code > span.co { color: #888888; font-style: italic; } code > span.ot { color: #007020; } code > span.al { color: #ff0000; font-weight: bold; } code > span.fu { color: #900; font-weight: bold; } code > span.er { color: #a61717; background-color: #e3d2d2; } </style> </head> <body> <h1 class="title toc-ignore">Embed Diffs in R Markdown Or Shiny</h1> <h4 class="author">Brodie Gaslam</h4> <div id="TOC"> <ul> <li><a href="#rmarkdown">Rmarkdown</a><ul> <li><a href="#basic-requirements">Basic Requirements</a></li> <li><a href="#embedded-css">Embedded CSS</a></li> <li><a href="#external-css">External CSS</a></li> <li><a href="#use-options">Use Options</a></li> </ul></li> <li><a href="#shiny">Shiny</a></li> </ul> </div> <div id="rmarkdown" class="section level2"> <h2>Rmarkdown</h2> <div id="basic-requirements" class="section level3"> <h3>Basic Requirements</h3> <p>Any R chunks that produce diffs should include the <code>results='asis'</code> option, e.g.:</p> <pre><code>```{r, comment="", results="asis"} # R code here ```</code></pre> </div> <div id="embedded-css" class="section level3"> <h3>Embedded CSS</h3> <p>This is what a basic code block should look like:</p> <pre><code>```{r, comment="", results="asis"} cat( # output to screen as.character( # convert to diff to character vector diffPrint( # run diff 1:5, 2:6, format="html", # specify html output style=list( html.output="diff.w.style" # configure html style ) ) ) ) ```</code></pre> <p>Here we use this same code as an actual markdown R code block:</p> <div class="sourceCode" id="cb3"><pre class="sourceCode r"><code class="sourceCode r"><a class="sourceLine" id="cb3-1" data-line-number="1"><span class="kw">cat</span>(</a> <a class="sourceLine" id="cb3-2" data-line-number="2"> <span class="kw">as.character</span>(</a> <a class="sourceLine" id="cb3-3" data-line-number="3"> <span class="kw">diffPrint</span>(</a> <a class="sourceLine" id="cb3-4" data-line-number="4"> <span class="dv">1</span><span class="op">:</span><span class="dv">5</span>, <span class="dv">2</span><span class="op">:</span><span class="dv">6</span>,</a> <a class="sourceLine" id="cb3-5" data-line-number="5"> <span class="dt">format=</span><span class="st">"html"</span>,</a> <a class="sourceLine" id="cb3-6" data-line-number="6"> <span class="dt">style=</span><span class="kw">list</span>(<span class="dt">html.output=</span><span class="st">"diff.w.style"</span>)</a> <a class="sourceLine" id="cb3-7" data-line-number="7">) ) )</a></code></pre></div> <style type="text/css"> /* Structural CSS ------------------------------------------------------------*/ /* * TBD whether we want a more fully table like structure; some of the visual * cues provided by the current set-up are useful (line wraps, etc.) */ DIV.diffobj-container PRE.diffobj-content { white-space: pre-wrap; margin: 0; } DIV.diffobj-container DIV.diffobj-row { width: 100%; font-family: monospace; display: table; table-layout: fixed; } DIV.diffobj-container DIV.diffobj-line { width: auto; display: table-cell; overflow: hidden; } DIV.diffobj-container DIV.diffobj-line>DIV { width: 100%; display: table; table-layout: auto; } DIV.diffobj-container DIV.diffobj-line.banner>DIV { display: table; table-layout: auto; /* set to fixed in JS */ } DIV.diffobj-container DIV.diffobj-text { display: table-cell; width: 100%; } DIV.diffobj-container DIV.diffobj-gutter { display: table-cell; padding: 0 0.2em; } DIV.diffobj-container DIV.diffobj-gutter DIV { display: table-cell; } #diffobj_content_meta DIV.diffobj-container DIV.diffobj-row { width: auto; } #diffobj_banner_meta DIV.diffobj-container DIV.diffobj-line.banner>DIV { table-layout: auto; } #diffobj_outer { overflow: hidden; } /* Summary -------------------------------------------------------------------*/ DIV.diffobj-container DIV.diffobj-summary DIV.map { word-wrap: break-word; padding-left: 1em; } DIV.diffobj-container DIV.diffobj-summary DIV.detail { padding-left: 1em; } /* Common elements -----------------------------------------------------------*/ DIV.diffobj-container DIV.diffobj-line.banner { font-size: 1.2em; font-weight: bold; overflow: hidden; } /* truncate banners */ DIV.diffobj-container DIV.diffobj-line.banner DIV.diffobj-text DIV{ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; width: 100%; /* need to compute and set in JS */ } DIV.diffobj-container DIV.diffobj-gutter, DIV.diffobj-container DIV.diffobj-guide, DIV.diffobj-container DIV.diffobj-fill, DIV.diffobj-container DIV.context_sep, DIV.diffobj-container SPAN.diffobj-trim { color: #999; } DIV.diffobj-container DIV.diffobj-header { font-size: 1.1em; } DIV.diffobj-container DIV.diffobj-text>DIV.diffobj-match, DIV.diffobj-container DIV.diffobj-text>DIV.diffobj-guide { background-color: #ffffff; } DIV.diffobj-container DIV.diffobj-text>DIV.diffobj-fill { background-color: transparent; } DIV.diffobj-container DIV.diffobj-text>DIV { padding-right: 3px; } DIV.diffobj-container DIV.diffobj-text>DIV { border-left: 1px solid #888888; } DIV.diffobj-container DIV.diffobj-line { background-color: #eeeeee; } DIV.diffobj-container DIV.diffobj-text>DIV, DIV.diffobj-container DIV.diffobj-header { padding-left: 0.5em; } DIV.diffobj-container DIV.diffobj-line>DIV.diffobj-match, DIV.diffobj-container DIV.diffobj-line>DIV.diffobj-fill, DIV.diffobj-container DIV.diffobj-line>DIV.diffobj-guide { border-left: 1px solid #888888; } /* github inspired color scheme - default ------------------------------------*/ DIV.diffobj-container.light.rgb SPAN.diffobj-word.insert, DIV.diffobj-container.light.rgb DIV.diffobj-line>DIV.insert { background-color: #a6f3a6; } DIV.diffobj-container.light.rgb SPAN.diffobj-word.delete, DIV.diffobj-container.light.rgb DIV.diffobj-line>DIV.delete { background-color: #f8c2c2; } DIV.diffobj-container.light.rgb DIV.diffobj-text>DIV.insert { background-color: #efffef; } DIV.diffobj-container.light.rgb DIV.diffobj-text>DIV.insert, DIV.diffobj-container.light.rgb DIV.diffobj-line>DIV.insert { border-left: 1px solid #33bb33; } DIV.diffobj-container.light.rgb DIV.diffobj-text>DIV.delete { background-color: #ffefef; } DIV.diffobj-container.light.rgb DIV.diffobj-text>DIV.delete, DIV.diffobj-container.light.rgb DIV.diffobj-line>DIV.delete { border-left: 1px solid #cc6666; } DIV.diffobj-container.light.rgb DIV.diffobj-header { background-color: #e0e6fa; border-left: 1px solid #9894b6; } /* Yellow Blue variation -----------------------------------------------------*/ DIV.diffobj-container.light.yb SPAN.diffobj-word.insert, DIV.diffobj-container.light.yb DIV.diffobj-line>DIV.insert { background-color: #c0cfff; } DIV.diffobj-container.light.yb SPAN.diffobj-word.delete, DIV.diffobj-container.light.yb DIV.diffobj-line>DIV.delete { background-color: #e7e780; } DIV.diffobj-container.light.yb DIV.diffobj-text>DIV.insert { background-color: #efefff; } DIV.diffobj-container.light.yb DIV.diffobj-text>DIV.insert, DIV.diffobj-container.light.yb DIV.diffobj-line>DIV.insert { border-left: 1px solid #3333bb; } DIV.diffobj-container.light.yb DIV.diffobj-text>DIV.delete { background-color: #fefee5; } DIV.diffobj-container.light.yb DIV.diffobj-text>DIV.delete, DIV.diffobj-container.light.yb DIV.diffobj-line>DIV.delete { border-left: 1px solid #aaaa55; } DIV.diffobj-container.light.yb DIV.diffobj-header { background-color: #afafaf; border-left: 1px solid #e3e3e3; color: #e9e9e9; } DIV.diffobj-container.light.yb DIV.diffobj-line { background-color: #eeeeee; } </style> <div class="diffobj-container light yb"> <pre class="diffobj-content"><div class="diffobj-row"><div class="diffobj-line banner"><div class="delete"><div class="diffobj-gutter"><div class="delete"><</div><div class="pad"> </div></div><div class="diffobj-text"><div class="delete"><span class="diffobj-word delete">1:5</span></div></div></div></div><div class="diffobj-line banner"><div class="insert"><div class="diffobj-gutter"><div class="insert">></div><div class="pad"> </div></div><div class="diffobj-text"><div class="insert"><span class="diffobj-word insert">2:6</span></div></div></div></div></div><div class="diffobj-row"><div class="diffobj-line"><div class="diffobj-header">@@ 1 @@</div></div><div class="diffobj-line"><div class="diffobj-header">@@ 1 @@</div></div></div><div class="diffobj-row"><div class="diffobj-line"><div class="delete"><div class="diffobj-gutter"><div class="delete"><</div><div class="pad"> </div></div><div class="diffobj-text"><div class="delete"><span class="diffobj-trim">[1] </span><span class="diffobj-word delete">1</span> 2 3 4 5<span class="diffobj-trim"></span></div></div></div></div><div class="diffobj-line"><div class="insert"><div class="diffobj-gutter"><div class="insert">></div><div class="pad"> </div></div><div class="diffobj-text"><div class="insert"><span class="diffobj-trim">[1] </span>2 3 4 5 <span class="diffobj-word insert">6</span><span class="diffobj-trim"></span></div></div></div></div></div></pre> </div> <p>This is an ugly implementation because it produces illegal HTML. The styles are directly embedded in the body of the document, outside of the HEAD tags. Although this is illegal HTML, it seems to work in most browsers. Another problem is that every diff you use in your document will inject the same CSS code over and over.</p> </div> <div id="external-css" class="section level3"> <h3>External CSS</h3> <p>A better option is to provide the CSS directly by modifying the <code>output</code> portion of the <a href="https://bookdown.org/yihui/rmarkdown/r-package-vignette.html">YAML header</a>:</p> <pre><code>--- output: rmarkdown::html_vignette: toc: true css: !expr diffobj::diffobj_css() ---</code></pre> <p>In reality you will probably want to specify multiple CSS files, including the original <code>rmarkdown</code> one:</p> <pre><code>--- output: rmarkdown::html_vignette: toc: true css: - !expr diffobj::diffobj_css() - !expr system.file("rmarkdown", "templates", "html_vignette", "resources", "vignette.css", package = "rmarkdown") ---</code></pre> <p>Once you set this up then you can use:</p> <div class="sourceCode" id="cb6"><pre class="sourceCode r"><code class="sourceCode r"><a class="sourceLine" id="cb6-1" data-line-number="1"><span class="kw">cat</span>(</a> <a class="sourceLine" id="cb6-2" data-line-number="2"> <span class="kw">as.character</span>(</a> <a class="sourceLine" id="cb6-3" data-line-number="3"> <span class="kw">diffPrint</span>(</a> <a class="sourceLine" id="cb6-4" data-line-number="4"> <span class="dv">1</span><span class="op">:</span><span class="dv">5</span>, <span class="dv">2</span><span class="op">:</span><span class="dv">6</span>,</a> <a class="sourceLine" id="cb6-5" data-line-number="5"> <span class="dt">format=</span><span class="st">"html"</span>,</a> <a class="sourceLine" id="cb6-6" data-line-number="6"> <span class="dt">style=</span><span class="kw">list</span>(<span class="dt">html.output=</span><span class="st">"diff.only"</span>) <span class="co"># notice this changed</span></a> <a class="sourceLine" id="cb6-7" data-line-number="7">) ) )</a></code></pre></div> <div class="diffobj-container light yb"> <pre class="diffobj-content"><div class="diffobj-row"><div class="diffobj-line banner"><div class="delete"><div class="diffobj-gutter"><div class="delete"><</div><div class="pad"> </div></div><div class="diffobj-text"><div class="delete"><span class="diffobj-word delete">1:5</span></div></div></div></div><div class="diffobj-line banner"><div class="insert"><div class="diffobj-gutter"><div class="insert">></div><div class="pad"> </div></div><div class="diffobj-text"><div class="insert"><span class="diffobj-word insert">2:6</span></div></div></div></div></div><div class="diffobj-row"><div class="diffobj-line"><div class="diffobj-header">@@ 1 @@</div></div><div class="diffobj-line"><div class="diffobj-header">@@ 1 @@</div></div></div><div class="diffobj-row"><div class="diffobj-line"><div class="delete"><div class="diffobj-gutter"><div class="delete"><</div><div class="pad"> </div></div><div class="diffobj-text"><div class="delete"><span class="diffobj-trim">[1] </span><span class="diffobj-word delete">1</span> 2 3 4 5<span class="diffobj-trim"></span></div></div></div></div><div class="diffobj-line"><div class="insert"><div class="diffobj-gutter"><div class="insert">></div><div class="pad"> </div></div><div class="diffobj-text"><div class="insert"><span class="diffobj-trim">[1] </span>2 3 4 5 <span class="diffobj-word insert">6</span><span class="diffobj-trim"></span></div></div></div></div></div></pre> </div> <p>This will omit the CSS, but since we include it via the YAML everything should work as expected.</p> </div> <div id="use-options" class="section level3"> <h3>Use Options</h3> <p>Almost all <code>diffobj</code> parameters can be specified via options:</p> <div class="sourceCode" id="cb7"><pre class="sourceCode r"><code class="sourceCode r"><a class="sourceLine" id="cb7-1" data-line-number="1"><span class="kw">options</span>(</a> <a class="sourceLine" id="cb7-2" data-line-number="2"> <span class="dt">diffobj.format=</span><span class="st">"html"</span>,</a> <a class="sourceLine" id="cb7-3" data-line-number="3"> <span class="dt">diffobj.style=</span><span class="kw">list</span>(<span class="dt">html.output=</span><span class="st">"diff.only"</span>)</a> <a class="sourceLine" id="cb7-4" data-line-number="4">)</a></code></pre></div> <p>Then you can just run the diff as normal:</p> <div class="sourceCode" id="cb8"><pre class="sourceCode r"><code class="sourceCode r"><a class="sourceLine" id="cb8-1" data-line-number="1"><span class="kw">cat</span>(<span class="kw">as.character</span>(<span class="kw">diffPrint</span>(<span class="dv">1</span><span class="op">:</span><span class="dv">5</span>, <span class="dv">2</span><span class="op">:</span><span class="dv">6</span>)))</a></code></pre></div> <div class="diffobj-container light yb"> <pre class="diffobj-content"><div class="diffobj-row"><div class="diffobj-line banner"><div class="delete"><div class="diffobj-gutter"><div class="delete"><</div><div class="pad"> </div></div><div class="diffobj-text"><div class="delete"><span class="diffobj-word delete">1:5</span></div></div></div></div><div class="diffobj-line banner"><div class="insert"><div class="diffobj-gutter"><div class="insert">></div><div class="pad"> </div></div><div class="diffobj-text"><div class="insert"><span class="diffobj-word insert">2:6</span></div></div></div></div></div><div class="diffobj-row"><div class="diffobj-line"><div class="diffobj-header">@@ 1 @@</div></div><div class="diffobj-line"><div class="diffobj-header">@@ 1 @@</div></div></div><div class="diffobj-row"><div class="diffobj-line"><div class="delete"><div class="diffobj-gutter"><div class="delete"><</div><div class="pad"> </div></div><div class="diffobj-text"><div class="delete"><span class="diffobj-trim">[1] </span><span class="diffobj-word delete">1</span> 2 3 4 5<span class="diffobj-trim"></span></div></div></div></div><div class="diffobj-line"><div class="insert"><div class="diffobj-gutter"><div class="insert">></div><div class="pad"> </div></div><div class="diffobj-text"><div class="insert"><span class="diffobj-trim">[1] </span>2 3 4 5 <span class="diffobj-word insert">6</span><span class="diffobj-trim"></span></div></div></div></div></div></pre> </div> </div> </div> <div id="shiny" class="section level2"> <h2>Shiny</h2> <p>Shiny usage is very similar to <code>rmarkdown</code>. In both cases we want to get <code>diffobj</code> to produce HTML output to embed in our document. If we are willing to embed the CSS with each diff, we can use:</p> <div class="sourceCode" id="cb9"><pre class="sourceCode r"><code class="sourceCode r"><a class="sourceLine" id="cb9-1" data-line-number="1"><span class="kw">library</span>(shiny)</a> <a class="sourceLine" id="cb9-2" data-line-number="2"><span class="kw">shinyApp</span>(</a> <a class="sourceLine" id="cb9-3" data-line-number="3"> <span class="dt">ui=</span><span class="kw">fluidPage</span>(<span class="kw">htmlOutput</span>(<span class="st">'diffobj_element'</span>)),</a> <a class="sourceLine" id="cb9-4" data-line-number="4"> <span class="dt">server=</span><span class="cf">function</span>(input, output) {</a> <a class="sourceLine" id="cb9-5" data-line-number="5"> output<span class="op">$</span>diffobj_element <-<span class="st"> </span><span class="kw">renderUI</span>({</a> <a class="sourceLine" id="cb9-6" data-line-number="6"> <span class="kw">HTML</span>(</a> <a class="sourceLine" id="cb9-7" data-line-number="7"> <span class="kw">as.character</span>(</a> <a class="sourceLine" id="cb9-8" data-line-number="8"> <span class="kw">diffPrint</span>(</a> <a class="sourceLine" id="cb9-9" data-line-number="9"> <span class="dv">1</span><span class="op">:</span><span class="dv">5</span>, <span class="dv">2</span><span class="op">:</span><span class="dv">6</span>,</a> <a class="sourceLine" id="cb9-10" data-line-number="10"> <span class="dt">format=</span><span class="st">"html"</span>,</a> <a class="sourceLine" id="cb9-11" data-line-number="11"> <span class="dt">style=</span><span class="kw">list</span>(<span class="dt">html.output=</span><span class="st">"diff.w.style"</span>)</a> <a class="sourceLine" id="cb9-12" data-line-number="12">) ) )}) } )</a></code></pre></div> <p>If we have many diffs, it may be preferable to use options and external style sheet:</p> <div class="sourceCode" id="cb10"><pre class="sourceCode r"><code class="sourceCode r"><a class="sourceLine" id="cb10-1" data-line-number="1"><span class="kw">options</span>(</a> <a class="sourceLine" id="cb10-2" data-line-number="2"> <span class="dt">diffobj.format=</span><span class="st">"html"</span>,</a> <a class="sourceLine" id="cb10-3" data-line-number="3"> <span class="dt">diffobj.style=</span><span class="kw">list</span>(<span class="dt">html.output=</span><span class="st">"diff.only"</span>)</a> <a class="sourceLine" id="cb10-4" data-line-number="4">)</a> <a class="sourceLine" id="cb10-5" data-line-number="5"><span class="kw">shinyApp</span>(</a> <a class="sourceLine" id="cb10-6" data-line-number="6"> <span class="dt">ui=</span><span class="kw">fluidPage</span>(</a> <a class="sourceLine" id="cb10-7" data-line-number="7"> <span class="kw">includeCSS</span>(<span class="kw">diffobj_css</span>()),</a> <a class="sourceLine" id="cb10-8" data-line-number="8"> <span class="kw">htmlOutput</span>(<span class="st">'diffobj_element'</span>)</a> <a class="sourceLine" id="cb10-9" data-line-number="9"> ),</a> <a class="sourceLine" id="cb10-10" data-line-number="10"> <span class="dt">server=</span><span class="cf">function</span>(input, output) {</a> <a class="sourceLine" id="cb10-11" data-line-number="11"> output<span class="op">$</span>diffobj_element <-<span class="st"> </span><span class="kw">renderUI</span>({</a> <a class="sourceLine" id="cb10-12" data-line-number="12"> <span class="kw">HTML</span>(<span class="kw">as.character</span>(<span class="kw">diffPrint</span>(<span class="dv">1</span><span class="op">:</span><span class="dv">5</span>, <span class="dv">2</span><span class="op">:</span><span class="dv">6</span>,)))</a> <a class="sourceLine" id="cb10-13" data-line-number="13">}) } )</a></code></pre></div> <p>Unlike with our <a href="#external-css">rmarkdown example</a>, this CSS is included in the body of the HTML document instead of in the header, so it is technically illegal like in our <a href="#embedded-css">embedded css example</a>.</p> </div> <!-- code folding --> <!-- dynamically load mathjax for compatibility with self-contained --> <script> (function () { var script = document.createElement("script"); script.type = "text/javascript"; script.src = "https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"; document.getElementsByTagName("head")[0].appendChild(script); })(); </script> </body> </html>