PageSourceSearch

https://ds002r-fds.netlify.app/notes

html ds002r-fds.netlify.app collected 2026-10-03 10:40:05 UTC 25,198 bytes, 645 lines download raw bytes

1<!DOCTYPE html>
2<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
3
4<meta charset="utf-8">
5<!-- This site is hosted on Netlify. Anyone can build and deploy a site
6     like this one for free: https://netlify.new/?utm_campaign=loops&utm_source=ai-legible&utm_medium=owned&utm_content=comment&utm_id=74fbad81-f871-4252-8909-44cabbc5f594
7     Netlify hosting facts for this site: static/SSR served via Netlify Edge. -->
8<meta name="generator" content="quarto-1.10.18">
9
10<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
11
12<meta name="description" content="Daily class notes for DS002R, Foundations of Data Science in R">
13
14<title>Class Notes – Foundations of Data Science in R</title>
15<style>
16/* Default styles provided by pandoc.
17** See https://pandoc.org/MANUAL.html#variables-for-html for config info.
18*/
19span.smallcaps{font-variant: small-caps;}
20div.columns{display: flex; gap: 1.5em;}
21div.column{flex: auto;}
22@media screen {
23div.columns{gap: min(4vw, 1.5em);}
24div.column{overflow-x: auto;}
25}
26div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
27ul.task-list{list-style: none;}
28ul.task-list li input[type="checkbox"] {
29  width: 0.8em;
30  margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */ 
31  vertical-align: middle;
32}
33</style>
34
35
36<script src="site_libs/quarto-nav/quarto-nav.js"></script>
vendor: 1 bytes, line 36
36
37<script src="site_libs/quarto-nav/headroom.min.js"></script>
vendor: 1 bytes, line 37
37
38<script src="site_libs/clipboard/clipboard.min.js"></script>
vendor: 1 bytes, line 38
38
39<script src="site_libs/quarto-search/autocomplete.umd.js"></script>
vendor: 1 bytes, line 39
39
40<script src="site_libs/quarto-search/fuse.min.js"></script>
vendor: 1 bytes, line 40
40
41<script src="site_libs/quarto-search/quarto-search.js"></script>
41
42<meta name="quarto:offset" content="./">
43<link href="./images/favicon.ico" rel="icon">
44<script src="site_libs/quarto-html/quarto.js" type="module"></script>
vendor: 1 bytes, line 44
44
45<script src="site_libs/quarto-html/tabsets/tabsets.js" type="module"></script>
vendor: 1 bytes, line 45
45
46<script src="site_libs/quarto-html/popper.min.js"></script>
vendor: 1 bytes, line 46
46
47<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
vendor: 1 bytes, line 47
47
48<script src="site_libs/quarto-html/anchor.min.js"></script>
48
49<link href="site_libs/quarto-html/tippy.css" rel="stylesheet">
50<link href="site_libs/quarto-html/quarto-syntax-highlighting-64a204ab8560d761af7679ceaba22944.css" rel="stylesheet" id="quarto-text-highlighting-styles">
51<script src="site_libs/bootstrap/bootstrap.min.js"></script>
51
52<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet">
53<link href="site_libs/bootstrap/bootstrap-a8111dbb49da88347f07f358db18fe74.min.css" rel="stylesheet" append-hash="true" id="quarto-bootstrap" data-mode="light">
54<link href="site_libs/quarto-contrib/fontawesome6-1.2.0/all.min.css" rel="stylesheet">
55<link href="site_libs/quarto-contrib/fontawesome6-1.2.0/latex-fontsize.css" rel="stylesheet">
56<script id="quarto-search-options" type="application/json">{
57  "location": "navbar",
58  "copy-button": false,
59  "collapse-after": 3,
60  "panel-placement": "end",
61  "type": "overlay",
62  "limit": 50,
63  "keyboard-shortcut": [
64    "f",
65    "/",
66    "s"
67  ],
68  "show-item-context": false,
69  "language": {
70    "search-no-results-text": "No results",
71    "search-matching-documents-text": "matching documents",
72    "search-copy-link-title": "Copy link to search",
73    "search-hide-matches-text": "Hide additional matches",
74    "search-more-match-text": "more match in this document",
75    "search-more-matches-text": "more matches in this document",
76    "search-clear-button-title": "Clear",
77    "search-text-placeholder": "",
78    "search-detached-cancel-button-title": "Cancel",
79    "search-submit-button-title": "Submit",
80    "search-label": "Search"
81  }
82}</script>
82
83
84
85</head>
86
87<body class="nav-fixed fullcontent quarto-light">
88
89<div id="quarto-search-results"></div>
90  <header id="quarto-header" class="headroom fixed-top">
91    <nav class="navbar navbar-expand-lg " data-bs-theme="dark">
92      <div class="navbar-container container-fluid">
93      <div class="navbar-brand-container mx-auto">
94    <a href="https://ds002r-fds.netlify.app/" class="navbar-brand navbar-brand-logo">
95    <img src="./images/st47s.png" alt="" class="navbar-logo light-content">
96    <img src="./images/st47s.png" alt="" class="navbar-logo dark-content">
97    </a>
98    <a class="navbar-brand" href="https://ds002r-fds.netlify.app/">
99    <span class="navbar-title">Foundations of Data Science in R</span>
100    </a>
101  </div>
102            <div id="quarto-search" class="" title="Search"></div>
103          <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" role="menu" aria-expanded="false" aria-label="Toggle navigation" onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }">
104  <span class="navbar-toggler-icon"></span>
105</button>
106          <div class="collapse navbar-collapse" id="navbarCollapse">
107            <ul class="navbar-nav navbar-nav-scroll ms-auto">
108  <li class="nav-item">
109    <a class='nav-link' href='/syllabus'> 
110<span class="menu-text">Syllabus</span></a>
111  </li>  
112  <li class="nav-item">
113    <a aria-current='page' class='nav-link active' href='/notes'> 
114<span class="menu-text">Class Notes</span></a>
115  </li>  
116  <li class="nav-item">
117    <a class='nav-link' href='/clicker_study'> 
118<span class="menu-text">Clicker Q</span></a>
119  </li>  
120  <li class="nav-item">
121    <a class='nav-link' href='/r-tip'> 
122<span class="menu-text">R tip</span></a>
123  </li>  
124  <li class="nav-item">
125    <a class='nav-link' href='/endangered_data'> 
126<span class="menu-text">Endangered Data</span></a>
127  </li>  
128  <li class="nav-item dropdown ">
129    <a class="nav-link dropdown-toggle" href="#" id="nav-menu-project" role="link" data-bs-toggle="dropdown" aria-expanded="false">
130 <span class="menu-text">Project</span>
131    </a>
132    <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="nav-menu-project">    
133        <li>
134    <a class='dropdown-item' href='/project'>
135 <span class="dropdown-text">semester mini-projects</span></a>
136  </li>  
137        <li>
138    <a class='dropdown-item' href='/project1'>
139 <span class="dropdown-text">project 1 - website</span></a>
140  </li>  
141        <li>
142    <a class="dropdown-item" href="./project2.html">
143 <span class="dropdown-text">project 2 - text analysis</span></a>
144  </li>  
145        <li>
146    <a class="dropdown-item" href="./project3.html">
147 <span class="dropdown-text">project 3 - simulation</span></a>
148  </li>  
149        <li>
150    <a class="dropdown-item" href="./project4.html">
151 <span class="dropdown-text">project 4 - ethics</span></a>
152  </li>  
153        <li>
154    <a class="dropdown-item" href="./project5.html">
155 <span class="dropdown-text">project 5 - SQL</span></a>
156  </li>  
157        <li>
158    <a class="dropdown-item" href="./project6.html">
159 <span class="dropdown-text">project 6 - fin</span></a>
160  </li>  
161        <li>
162    <a class="dropdown-item" href="https://hardin47.netlify.app/courses/data/">
163 <span class="dropdown-text">Data Sources</span></a>
164  </li>  
165    </ul>
166  </li>
167  <li class="nav-item">
168    <a class='nav-link' href='/github'> 
169<span class="menu-text">GitHub</span></a>
170  </li>  
171</ul>
172          </div> <!-- /navcollapse -->
173            <div class="quarto-navbar-tools">
174</div>
175      </div> <!-- /container-fluid -->
176    </nav>
177</header>
178<!-- content -->
179<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-article page-navbar">
180<!-- sidebar -->
181<!-- margin-sidebar -->
182    
183<!-- main -->
184<main class="content page-columns page-full" id="quarto-document-content">
185
186<header id="title-block-header" class="quarto-title-block default">
187<div class="quarto-title">
188<h1 class="title">Class Notes</h1>
189</div>
190
191<div>
192  <div class="description">
193    <p>Daily class notes for DS002R, Foundations of Data Science in R</p>
194  </div>
195</div>
196
197
198<div class="quarto-title-meta">
199
200    
201  
202    
203  </div>
204  
205
206
207</header>
208
209
210<p>Class notes can be found at <a href="http://st47s.com/DS002R/Notes/" target="_blank">http://st47s.com/DS002R/Notes/</a>.</p>
211<p>
212</p>
213<div class="column-page">
214<iframe src="https://st47s.com/DS002R/Notes/" title="Class Notes for DS 002R" width="1000" height="500" data-external="1">
215</iframe>
216</div>
217
218
219
220<div id="quarto-appendix" class="default"><section class="quarto-appendix-contents" id="quarto-reuse"><h2 class="anchored quarto-appendix-heading">Reuse</h2><div class="quarto-appendix-contents"><div>CC-BY-SA-4.0</div></div></section></div></main> <!-- /main -->
221<script id="quarto-html-after-body" type="application/javascript">
222  window.document.addEventListener("DOMContentLoaded", function (event) {
223    const icon = "";
224    const anchorJS = new window.AnchorJS();
225    anchorJS.options = {
226      placement: 'right',
227      icon: icon
228    };
229    anchorJS.add('.anchored');
230    const isCodeAnnotation = (el) => {
231      for (const clz of el.classList) {
232        if (clz.startsWith('code-annotation-')) {                     
233          return true;
234        }
235      }
236      return false;
237    }
238    const onCopySuccess = function(e) {
239      // button target
240      const button = e.trigger;
241      // don't keep focus
242      button.blur();
243      // flash "checked"
244      button.classList.add('code-copy-button-checked');
245      var currentTitle = button.getAttribute("title");
246      button.setAttribute("title", "Copied!");
247      let tooltip;
248      if (window.bootstrap) {
249        button.setAttribute("data-bs-toggle", "tooltip");
250        button.setAttribute("data-bs-placement", "left");
251        button.setAttribute("data-bs-title", "Copied!");
252        tooltip = new bootstrap.Tooltip(button, 
253          { trigger: "manual", 
254            customClass: "code-copy-button-tooltip",
255            offset: [0, -8]});
256        tooltip.show();    
257      }
258      setTimeout(function() {
259        if (tooltip) {
260          tooltip.hide();
261          button.removeAttribute("data-bs-title");
262          button.removeAttribute("data-bs-toggle");
263          button.removeAttribute("data-bs-placement");
264        }
265        button.setAttribute("title", currentTitle);
266        button.classList.remove('code-copy-button-checked');
267      }, 1000);
268      // clear code selection
269      e.clearSelection();
270    }
271    const getTextToCopy = function(trigger) {
272      const outerScaffold = trigger.parentElement.cloneNode(true);
273      const codeEl = outerScaffold.querySelector('code');
274      for (const childEl of codeEl.children) {
275        if (isCodeAnnotation(childEl)) {
276          childEl.remove();
277        }
278      }
279      return codeEl.innerText;
280    }
281    const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', {
282      text: getTextToCopy
283    });
284    clipboard.on('success', onCopySuccess);
285    if (window.document.getElementById('quarto-embedded-source-code-modal')) {
286      const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', {
287        text: getTextToCopy,
288        container: window.document.getElementById('quarto-embedded-source-code-modal')
289      });
290      clipboardModal.on('success', onCopySuccess);
291    }
292      var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
293      var mailtoRegex = new RegExp(/^mailto:/);
294        var filterRegex = new RegExp("https:\/\/ds002r-fds\.netlify\.app\/");
295      var isInternal = (href) => {
296          return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
297      }
298      // Inspect non-navigation links and adorn them if external
299     var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool):not(.about-link)');
300      for (var i=0; i<links.length; i++) {
301        const link = links[i];
302        if (!isInternal(link.href)) {
303          // undo the damage that might have been done by quarto-nav.js in the case of
304          // links that we want to consider external
305          if (link.dataset.originalHref !== undefined) {
306            link.href = link.dataset.originalHref;
307          }
308        }
309      }
310    function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
311      const config = {
312        allowHTML: true,
313        maxWidth: 500,
314        delay: 100,
315        arrow: false,
316        appendTo: function(el) {
317            return el.parentElement;
318        },
319        interactive: true,
320        interactiveBorder: 10,
321        theme: 'quarto',
322        placement: 'bottom-start',
323      };
324      if (contentFn) {
325        config.content = contentFn;
326      }
327      if (onTriggerFn) {
328        config.onTrigger = onTriggerFn;
329      }
330      if (onUntriggerFn) {
331        config.onUntrigger = onUntriggerFn;
332      }
333      window.tippy(el, config); 
334    }
335    const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
336    for (var i=0; i<noterefs.length; i++) {
337      const ref = noterefs[i];
338      tippyHover(ref, function() {
339        // use id or data attribute instead here
340        let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
341        try { href = new URL(href).hash; } catch {}
342        const id = href.replace(/^#\/?/, "");
343        const note = window.document.getElementById(id);
344        if (note) {
345          return note.innerHTML;
346        } else {
347          return "";
348        }
349      });
350    }
351    const xrefs = window.document.querySelectorAll('a.quarto-xref');
352    const processXRef = (id, note) => {
353      // Strip column container classes
354      const stripColumnClz = (el) => {
355        el.classList.remove("page-full", "page-columns");
356        if (el.children) {
357          for (const child of el.children) {
358            stripColumnClz(child);
359          }
360        }
361      }
362      stripColumnClz(note)
363      if (id === null || id.startsWith('sec-')) {
364        // Special case sections, only their first couple elements
365        const container = document.createElement("div");
366        if (note.children && note.children.length > 2) {
367          container.appendChild(note.children[0].cloneNode(true));
368          for (let i = 1; i < note.children.length; i++) {
369            const child = note.children[i];
370            if (child.tagName === "P" && child.innerText === "") {
371              continue;
372            } else {
373              container.appendChild(child.cloneNode(true));
374              break;
375            }
376          }
377          if (window.Quarto?.typesetMath) {
378            window.Quarto.typesetMath(container);
379          }
380          return container.innerHTML
381        } else {
382          if (window.Quarto?.typesetMath) {
383            window.Quarto.typesetMath(note);
384          }
385          return note.innerHTML;
386        }
387      } else {
388        // Remove any anchor links if they are present
389        const anchorLink = note.querySelector('a.anchorjs-link');
390        if (anchorLink) {
391          anchorLink.remove();
392        }
393        if (window.Quarto?.typesetMath) {
394          window.Quarto.typesetMath(note);
395        }
396        if (note.classList.contains("callout")) {
397          return note.outerHTML;
398        } else {
399          return note.innerHTML;
400        }
401      }
402    }
403    for (var i=0; i<xrefs.length; i++) {
404      const xref = xrefs[i];
405      tippyHover(xref, undefined, function(instance) {
406        instance.disable();
407        let url = xref.getAttribute('href');
408        let hash = undefined; 
409        if (url.startsWith('#')) {
410          hash = url;
411        } else {
412          try { hash = new URL(url).hash; } catch {}
413        }
414        if (hash) {
415          const id = hash.replace(/^#\/?/, "");
416          const note = window.document.getElementById(id);
417          if (note !== null) {
418            try {
419              const html = processXRef(id, note.cloneNode(true));
420              instance.setContent(html);
421            } finally {
422              instance.enable();
423              instance.show();
424            }
425          } else {
426            // See if we can fetch this
427            fetch(url.split('#')[0])
428            .then(res => res.text())
429            .then(html => {
430              const parser = new DOMParser();
431              const htmlDoc = parser.parseFromString(html, "text/html");
432              const note = htmlDoc.getElementById(id);
433              if (note !== null) {
434                const html = processXRef(id, note);
435                instance.setContent(html);
436              } 
437            }).finally(() => {
438              instance.enable();
439              instance.show();
440            });
441          }
442        } else {
443          // See if we can fetch a full url (with no hash to target)
444          // This is a special case and we should probably do some content thinning / targeting
445          fetch(url)
446          .then(res => res.text())
447          .then(html => {
448            const parser = new DOMParser();
449            const htmlDoc = parser.parseFromString(html, "text/html");
450            const note = htmlDoc.querySelector('main.content');
451            if (note !== null) {
452              // This should only happen for chapter cross references
453              // (since there is no id in the URL)
454              // remove the first header
455              if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
456                note.children[0].remove();
457              }
458              const html = processXRef(null, note);
459              instance.setContent(html);
460            } 
461          }).finally(() => {
462            instance.enable();
463            instance.show();
464          });
465        }
466      }, function(instance) {
467      });
468    }
469        let selectedAnnoteEl;
470        const selectorForAnnotation = ( cell, annotation) => {
471          let cellAttr = 'data-code-cell="' + cell + '"';
472          let lineAttr = 'data-code-annotation="' +  annotation + '"';
473          const selector = 'span[' + cellAttr + '][' + lineAttr + ']';
474          return selector;
475        }
476        const selectCodeLines = (annoteEl) => {
477          const doc = window.document;
478          const targetCell = annoteEl.getAttribute("data-target-cell");
479          const targetAnnotation = annoteEl.getAttribute("data-target-annotation");
480          const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));
481          const lines = annoteSpan.getAttribute("data-code-lines").split(",");
482          const lineIds = lines.map((line) => {
483            return targetCell + "-" + line;
484          })
485          let top = null;
486          let height = null;
487          let parent = null;
488          if (lineIds.length > 0) {
489              //compute the position of the single el (top and bottom and make a div)
490              const el = window.document.getElementById(lineIds[0]);
491              top = el.offsetTop;
492              height = el.offsetHeight;
493              parent = el.parentElement.parentElement;
494            if (lineIds.length > 1) {
495              const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);
496              const bottom = lastEl.offsetTop + lastEl.offsetHeight;
497              height = bottom - top;
498            }
499            if (top !== null && height !== null && parent !== null) {
500              // cook up a div (if necessary) and position it 
501              let div = window.document.getElementById("code-annotation-line-highlight");
502              if (div === null) {
503                div = window.document.createElement("div");
504                div.setAttribute("id", "code-annotation-line-highlight");
505                div.style.position = 'absolute';
506                parent.appendChild(div);
507              }
508              div.style.top = top - 2 + "px";
509              div.style.height = height + 4 + "px";
510              div.style.left = 0;
511              let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
512              if (gutterDiv === null) {
513                gutterDiv = window.document.createElement("div");
514                gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter");
515                gutterDiv.style.position = 'absolute';
516                const codeCell = window.document.getElementById(targetCell);
517                const gutter = codeCell.querySelector('.code-annotation-gutter');
518                gutter.appendChild(gutterDiv);
519              }
520              gutterDiv.style.top = top - 2 + "px";
521              gutterDiv.style.height = height + 4 + "px";
522            }
523            selectedAnnoteEl = annoteEl;
524          }
525        };
526        const unselectCodeLines = () => {
527          const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"];
528          elementsIds.forEach((elId) => {
529            const div = window.document.getElementById(elId);
530            if (div) {
531              div.remove();
532            }
533          });
534          selectedAnnoteEl = undefined;
535        };
536          // Handle positioning of the toggle
537      window.addEventListener(
538        "resize",
539        throttle(() => {
540          elRect = undefined;
541          if (selectedAnnoteEl) {
542            selectCodeLines(selectedAnnoteEl);
543          }
544        }, 10)
545      );
546      function throttle(fn, ms) {
547      let throttle = false;
548      let timer;
549        return (...args) => {
550          if(!throttle) { // first call gets through
551              fn.apply(this, args);
552              throttle = true;
553          } else { // all the others get throttled
554              if(timer) clearTimeout(timer); // cancel #2
555              timer = setTimeout(() => {
556                fn.apply(this, args);
557                timer = throttle = false;
558              }, ms);
559          }
560        };
561      }
562        // Attach click handler to the DT
563        const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
564        for (const annoteDlNode of annoteDls) {
565          annoteDlNode.addEventListener('click', (event) => {
566            const clickedEl = event.target;
567            if (clickedEl !== selectedAnnoteEl) {
568              unselectCodeLines();
569              const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');
570              if (activeEl) {
571                activeEl.classList.remove('code-annotation-active');
572              }
573              selectCodeLines(clickedEl);
574              clickedEl.classList.add('code-annotation-active');
575            } else {
576              // Unselect the line
577              unselectCodeLines();
578              clickedEl.classList.remove('code-annotation-active');
579            }
580          });
581        }
582    const findCites = (el) => {
583      const parentEl = el.parentElement;
584      if (parentEl) {
585        const cites = parentEl.dataset.cites;
586        if (cites) {
587          return {
588            el,
589            cites: cites.split(' ')
590          };
591        } else {
592          return findCites(el.parentElement)
593        }
594      } else {
595        return undefined;
596      }
597    };
598    var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
599    for (var i=0; i<bibliorefs.length; i++) {
600      const ref = bibliorefs[i];
601      const citeInfo = findCites(ref);
602      if (citeInfo) {
603        tippyHover(citeInfo.el, function() {
604          var popup = window.document.createElement('div');
605          citeInfo.cites.forEach(function(cite) {
606            var citeDiv = window.document.createElement('div');
607            citeDiv.classList.add('hanging-indent');
608            citeDiv.classList.add('csl-entry');
609            var biblioDiv = window.document.getElementById('ref-' + cite);
610            if (biblioDiv) {
611              citeDiv.innerHTML = biblioDiv.innerHTML;
612            }
613            popup.appendChild(citeDiv);
614          });
615          return popup.innerHTML;
616        });
617      }
618    }
619  });
620  </script>
620
621</div> <!-- /content -->
622<footer class="footer">
623  <div class="nav-footer">
624    <div class="nav-footer-left">
625<p><a href="https://hardin47.netlify.app/research/"><i class="fa-solid fa-book" aria-label="book"></i></a> <a href="https://hardin47.netlify.app/resume.pdf" target="_blank"><i class="fa-solid fa-bookmark"></i></a> <a href="mailto:[email protected]" target="_blank"><i class="fa-solid fa-at"></i></a> <a href="https://scholar.google.com/citations?user=c5Y77poAAAAJ&amp;hl=en" target="_blank"><i class="fa-brands fa-google-scholar"></i></a> <a href="https://www.researchgate.net/scientific-contributions/Johanna-Hardin-9764530" target="_blank"><i class="fa-brands fa-researchgate"></i></a><br>
626<a href="https://github.com/hardin47" target="_blank"><i class="fa-brands fa-github"></i></a> <a href="https://www.linkedin.com/in/jo-hardin-b91a4b55" target="_blank"><i class="fa-brands fa-linkedin-in"></i></a></p>
627</div>   
628    <div class="nav-footer-center">
629      <ul class="footer-items list-unstyled">
630    <li class="nav-item">
631 <br> © Jo Hardin, 2026 -- <a href="mailto: [email protected]">[email protected]</a> -- <a href="https://hardin47.netlify.app/">https://hardin47.netlify.app/</a> <br> <br>
632DS002R -- Foundations of Data Science in R -- Pomona College <br>
633  </li>  
634</ul>
635    </div>
636    <div class="nav-footer-right">
637      &nbsp;
638    </div>
639  </div>
640</footer>
641
642
643
644
645</body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.