2025-01-12 04:36:52 +08:00

457 lines
17 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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" />
<title>Printing a tibble: Tracking control flow</title>
<script>// Pandoc 2.9 adds attributes on both header and div. We remove the former (to
// be compatible with the behavior of Pandoc < 2.8).
document.addEventListener('DOMContentLoaded', function(e) {
var hs = document.querySelectorAll("div.section[class*='level'] > :first-child");
var i, h, a;
for (i = 0; i < hs.length; i++) {
h = hs[i];
if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6
a = h.attributes;
while (a.length > 0) h.removeAttribute(a[0].name);
}
});
</script>
<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">
pre > code.sourceCode { white-space: pre; position: relative; }
pre > code.sourceCode > span { line-height: 1.25; }
pre > code.sourceCode > span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre > code.sourceCode { white-space: pre-wrap; }
pre > code.sourceCode > span { display: inline-block; text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
{ counter-reset: source-line 0; }
pre.numberSource code > span
{ position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code > span > a:first-child::before
{ content: counter(source-line);
position: relative; left: -1em; text-align: right; vertical-align: baseline;
border: none; display: inline-block;
-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 {
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ff0000; font-weight: bold; }
code span.an { color: #60a0b0; font-weight: bold; font-style: italic; }
code span.at { color: #7d9029; }
code span.bn { color: #40a070; }
code span.bu { color: #008000; }
code span.cf { color: #007020; font-weight: bold; }
code span.ch { color: #4070a0; }
code span.cn { color: #880000; }
code span.co { color: #60a0b0; font-style: italic; }
code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; }
code span.do { color: #ba2121; font-style: italic; }
code span.dt { color: #902000; }
code span.dv { color: #40a070; }
code span.er { color: #ff0000; font-weight: bold; }
code span.ex { }
code span.fl { color: #40a070; }
code span.fu { color: #06287e; }
code span.im { color: #008000; font-weight: bold; }
code span.in { color: #60a0b0; font-weight: bold; font-style: italic; }
code span.kw { color: #007020; font-weight: bold; }
code span.op { color: #666666; }
code span.ot { color: #007020; }
code span.pp { color: #bc7a00; }
code span.sc { color: #4070a0; }
code span.ss { color: #bb6688; }
code span.st { color: #4070a0; }
code span.va { color: #19177c; }
code span.vs { color: #4070a0; }
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; }
</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; }
var j = 0;
while (j < rules.length) {
var rule = rules[j];
// check if there is a div.sourceCode rule
if (rule.type !== rule.STYLE_RULE || rule.selectorText !== "div.sourceCode") {
j++;
continue;
}
var style = rule.style.cssText;
// check if color or background-color is set
if (rule.style.color === '' && rule.style.backgroundColor === '') {
j++;
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">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.35;
}
#TOC {
clear: both;
margin: 0 0 10px 10px;
padding: 4px;
width: 400px;
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: 0.5em 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;
}
pre, code {
background-color: #f7f7f7;
border-radius: 3px;
color: #333;
white-space: pre-wrap;
}
pre {
border-radius: 3px;
margin: 5px 0px 10px 0px;
padding: 10px;
}
pre:not([class]) {
background-color: #f7f7f7;
}
code {
font-family: Consolas, Monaco, 'Courier New', monospace;
font-size: 85%;
}
p > code, li > code {
padding: 2px 0px;
}
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;
font-size: 35px;
line-height: 40px;
}
h2 {
border-bottom: 4px solid #f7f7f7;
padding-top: 10px;
padding-bottom: 2px;
font-size: 145%;
}
h3 {
border-bottom: 2px solid #f7f7f7;
padding-top: 10px;
font-size: 120%;
}
h4 {
border-bottom: 1px solid #f7f7f7;
margin-left: 8px;
font-size: 105%;
}
h5, h6 {
border-bottom: 1px solid #ccc;
font-size: 105%;
}
a {
color: #0033dd;
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">Printing a tibble: Tracking control
flow</h1>
<p>What happens when a tibble is printed? This vignette shows the actual
control flow, powered by the <a href="https://github.com/r-lib/debugme#readme">debugme package</a>. See
<code>vignette(&quot;printing&quot;)</code> for a detailed description of the
control and data flows.</p>
<p>To activate debugging, we need to set an environment variable before
loading the pillar package. As a result, debug strings in pillars code
are replaced with calls to a logging function.</p>
<p>By default, debugme also shows timestamps. This is disabled to keep
the output stable.</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb1-1"><a href="#cb1-1" tabindex="-1"></a><span class="fu">Sys.setenv</span>(<span class="at">DEBUGME =</span> <span class="st">&quot;!!!!pillar&quot;</span>)</span>
<span id="cb1-2"><a href="#cb1-2" tabindex="-1"></a><span class="fu">Sys.setenv</span>(<span class="at">DEBUGME_SHOW_TIMESTAMP =</span> <span class="st">&quot;no&quot;</span>)</span>
<span id="cb1-3"><a href="#cb1-3" tabindex="-1"></a></span>
<span id="cb1-4"><a href="#cb1-4" tabindex="-1"></a><span class="fu">library</span>(pillar)</span>
<span id="cb1-5"><a href="#cb1-5" tabindex="-1"></a></span>
<span id="cb1-6"><a href="#cb1-6" tabindex="-1"></a>tbl <span class="ot">&lt;-</span> tibble<span class="sc">::</span><span class="fu">tibble</span>(<span class="at">a =</span> <span class="dv">1</span><span class="sc">:</span><span class="dv">3</span>, <span class="at">b =</span> tibble<span class="sc">::</span><span class="fu">tibble</span>(<span class="at">c =</span> <span class="dv">4</span><span class="sc">:</span><span class="dv">6</span>, <span class="at">d =</span> <span class="dv">7</span><span class="sc">:</span><span class="dv">9</span>), <span class="at">e =</span> <span class="dv">10</span><span class="sc">:</span><span class="dv">12</span>)</span>
<span id="cb1-7"><a href="#cb1-7" tabindex="-1"></a><span class="fu">print</span>(tbl, <span class="at">width =</span> <span class="dv">23</span>)</span></code></pre></div>
<pre><code>#&gt; #&gt; pillar tbl_format_setup()
#&gt; #&gt; pillar +-tbl_format_setup.tbl()
#&gt; #&gt; pillar +-ctl_colonnade()
#&gt; #&gt; pillar +-ctl_new_compound_pillar(width = 21, title = &quot;a&quot;)
#&gt; #&gt; pillar +-ctl_new_compound_pillar.tbl(width = 21, title = &quot;a&quot;)
#&gt; #&gt; pillar +-ctl_new_pillar(width = 21, title = &quot;a&quot;)
#&gt; #&gt; pillar +-ctl_new_pillar.tbl(width = 21, title = &quot;a&quot;)
#&gt; #&gt; pillar +-pillar(title = &quot;a&quot;, width = 21)
#&gt; #&gt; pillar +-new_pillar_title(x = &quot;a&quot;)
#&gt; #&gt; pillar +-new_pillar_type(class(x) = &quot;integer&quot;)
#&gt; #&gt; pillar +-pillar_shaft(class(x) = &quot;integer&quot;)
#&gt; #&gt; pillar +-new_pillar_component(x = &lt;list: &lt;pllr_sh_&gt;&gt;, width = 1L, min_width = 1L)
#&gt; #&gt; pillar +-new_pillar(width = 21, class = NULL)
#&gt; #&gt; pillar +-new_pillar_component(x = &lt;list: &lt;pllr_ttl&gt;&gt;, width = 1L, min_width = 1L)
#&gt; #&gt; pillar +-new_pillar_component(x = &lt;list: &lt;pllr_typ&gt;&gt;, width = 5L, min_width = 5L)
#&gt; #&gt; pillar +-ctl_new_compound_pillar(width = 15, title = &quot;b&quot;)
#&gt; #&gt; pillar +-ctl_new_compound_pillar.tbl(width = 15, title = &quot;b&quot;)
#&gt; #&gt; pillar +-ctl_new_compound_pillar(width = 15, title = &lt;chr: &quot;b$&quot;, &quot;c&quot;&gt;)
#&gt; #&gt; pillar +-ctl_new_compound_pillar.tbl(width = 15, title = &lt;chr: &quot;b$&quot;, &quot;c&quot;&gt;)
#&gt; #&gt; pillar +-ctl_new_pillar(width = 15, title = &quot;b$c&quot;)
#&gt; #&gt; pillar +-ctl_new_pillar.tbl(width = 15, title = &quot;b$c&quot;)
#&gt; #&gt; pillar +-pillar(title = &quot;b$c&quot;, width = 15)
#&gt; #&gt; pillar +-new_pillar_title(x = &quot;b$c&quot;)
#&gt; #&gt; pillar +-new_pillar_type(class(x) = &quot;integer&quot;)
#&gt; #&gt; pillar +-pillar_shaft(class(x) = &quot;integer&quot;)
#&gt; #&gt; pillar +-new_pillar_component(x = &lt;list: &lt;pllr_sh_&gt;&gt;, width = 1L, min_width = 1L)
#&gt; #&gt; pillar +-new_pillar(width = 15, class = NULL)
#&gt; #&gt; pillar +-new_pillar_component(x = &lt;list: &lt;pllr_ttl&gt;&gt;, width = 3L, min_width = 3L)
#&gt; #&gt; pillar +-new_pillar_component(x = &lt;list: &lt;pllr_typ&gt;&gt;, width = 5L, min_width = 5L)
#&gt; #&gt; pillar +-ctl_new_compound_pillar(width = 9, title = &lt;chr: &quot;$&quot;, &quot;d&quot;&gt;)
#&gt; #&gt; pillar +-ctl_new_compound_pillar.tbl(width = 9, title = &lt;chr: &quot;$&quot;, &quot;d&quot;&gt;)
#&gt; #&gt; pillar +-ctl_new_pillar(width = 9, title = &quot;$d&quot;)
#&gt; #&gt; pillar +-ctl_new_pillar.tbl(width = 9, title = &quot;$d&quot;)
#&gt; #&gt; pillar +-pillar(title = &quot;$d&quot;, width = 9)
#&gt; #&gt; pillar +-new_pillar_title(x = &quot;$d&quot;)
#&gt; #&gt; pillar +-new_pillar_type(class(x) = &quot;integer&quot;)
#&gt; #&gt; pillar +-pillar_shaft(class(x) = &quot;integer&quot;)
#&gt; #&gt; pillar +-new_pillar_component(x = &lt;list: &lt;pllr_sh_&gt;&gt;, width = 1L, min_width = 1L)
#&gt; #&gt; pillar +-new_pillar(width = 9, class = NULL)
#&gt; #&gt; pillar +-new_pillar_component(x = &lt;list: &lt;pllr_ttl&gt;&gt;, width = 2L, min_width = 2L)
#&gt; #&gt; pillar +-new_pillar_component(x = &lt;list: &lt;pllr_typ&gt;&gt;, width = 5L, min_width = 5L)
#&gt; #&gt; pillar +-new_pillar_component(x = &lt;list: &lt;pllr_ttl&gt;, &lt;pllr_ttl&gt;&gt;, width = &lt;int: 3L, 2L&gt;, min_width = &lt;int: 3L, 2L&gt;)
#&gt; #&gt; pillar +-new_pillar_component(x = &lt;list: &lt;pllr_typ&gt;, &lt;pllr_typ&gt;&gt;, width = &lt;int: 5L, 5L&gt;, min_width = &lt;int: 5L, 5L&gt;)
#&gt; #&gt; pillar +-new_pillar_component(x = &lt;list: &lt;pllr_sh_&gt;, &lt;pllr_sh_&gt;&gt;, width = &lt;int: 1L, 1L&gt;, min_width = &lt;int: 1L, 1L&gt;)
#&gt; #&gt; pillar +-new_pillar(width = NULL, class = &quot;compound_pillar&quot;)
#&gt; #&gt; pillar +-ctl_new_compound_pillar(width = 3, title = &quot;e&quot;)
#&gt; #&gt; pillar +-ctl_new_compound_pillar.tbl(width = 3, title = &quot;e&quot;)
#&gt; #&gt; pillar +-ctl_new_pillar(width = 3, title = &quot;e&quot;)
#&gt; #&gt; pillar +-ctl_new_pillar.tbl(width = 3, title = &quot;e&quot;)
#&gt; #&gt; pillar +-pillar(title = &quot;e&quot;, width = 3)
#&gt; #&gt; pillar +-new_pillar_title(x = &quot;e&quot;)
#&gt; #&gt; pillar +-new_pillar_type(class(x) = &quot;integer&quot;)
#&gt; #&gt; pillar +-new_pillar_component(x = &lt;list: &lt;pllr_ttl&gt;, &lt;pllr_ttl&gt;, &lt;pllr_ttl&gt;&gt;, width = &lt;int: 1L, 3L, 2L&gt;, min_width = &lt;int: 1L, 3L, 2L&gt;)
#&gt; #&gt; pillar +-new_pillar_component(x = &lt;list: &lt;pllr_typ&gt;, &lt;pllr_typ&gt;, &lt;pllr_typ&gt;&gt;, width = &lt;int: 5L, 5L, 5L&gt;, min_width = &lt;int: 5L, 5L, 5L&gt;)
#&gt; #&gt; pillar +-new_pillar_component(x = &lt;list: &lt;pllr_sh_&gt;, &lt;pllr_sh_&gt;, &lt;pllr_sh_&gt;&gt;, width = &lt;int: 1L, 1L, 1L&gt;, min_width = &lt;int: 1L, 1L, 1L&gt;)
#&gt; #&gt; pillar +-new_pillar(width = NULL, class = &quot;compound_pillar&quot;)
#&gt; #&gt; pillar +-new_pillar(width = NULL, class = NULL)
#&gt; #&gt; pillar +-new_pillar_component(x = &lt;list: &lt;pllr_ttl&gt;&gt;, width = 1L, min_width = 1L)
#&gt; #&gt; pillar +-new_pillar_component(x = &lt;list: &lt;pllr_typ&gt;&gt;, width = 5L, min_width = 5L)
#&gt; #&gt; pillar +-new_pillar_component(x = &lt;list: &lt;pllr_sh_&gt;&gt;, width = 1L, min_width = 1L)
#&gt; #&gt; pillar +-new_pillar(width = NULL, class = NULL)
#&gt; #&gt; pillar +-new_pillar_component(x = &lt;list: &lt;pllr_ttl&gt;&gt;, width = 3L, min_width = 3L)
#&gt; #&gt; pillar +-new_pillar_component(x = &lt;list: &lt;pllr_typ&gt;&gt;, width = 5L, min_width = 5L)
#&gt; #&gt; pillar +-new_pillar_component(x = &lt;list: &lt;pllr_sh_&gt;&gt;, width = 1L, min_width = 1L)
#&gt; #&gt; pillar +-new_pillar(width = NULL, class = NULL)
#&gt; #&gt; pillar +-new_pillar_component(x = &lt;list: &lt;pllr_ttl&gt;&gt;, width = 2L, min_width = 2L)
#&gt; #&gt; pillar +-new_pillar_component(x = &lt;list: &lt;pllr_typ&gt;&gt;, width = 5L, min_width = 5L)
#&gt; #&gt; pillar +-new_pillar_component(x = &lt;list: &lt;pllr_sh_&gt;&gt;, width = 1L, min_width = 1L)
#&gt; #&gt; pillar +-new_pillar_component(x = &lt;list: &lt;pllr_rf_&gt;&gt;, width = 1L, min_width = 1L)
#&gt; #&gt; pillar +-new_pillar_component(x = &lt;list: &lt;pllr_rf_&gt;&gt;, width = 1L, min_width = 1L)
#&gt; #&gt; pillar +-new_pillar(width = NULL, class = NULL)
#&gt; #&gt; # A tibble: 3 x 3
#&gt; #&gt; a b$c $d
#&gt; #&gt; &lt;int&gt; &lt;int&gt; &lt;int&gt;
#&gt; #&gt; 1 1 4 7
#&gt; #&gt; 2 2 5 8
#&gt; #&gt; 3 3 6 9
#&gt; #&gt; # … with 1 more
#&gt; #&gt; # variable: e &lt;int&gt;</code></pre>
<!-- 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>