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&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 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.