1<!DOCTYPE html> 2<html xmlns="http://www.w3.org/1999/xhtml" lang="en-GB" xml:lang="en-GB"><head> 3 4<meta charset="utf-8"> 5<meta name="generator" content="quarto-1.9.37"> 6 7<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"> 8 9 10<title>Eleanor Jackson</title> 11<style> 12/* Default styles provided by pandoc. 13** See https://pandoc.org/MANUAL.html#variables-for-html for config info. 14*/ 15code{white-space: pre-wrap;} 16span.smallcaps{font-variant: small-caps;} 17div.columns{display: flex; gap: min(4vw, 1.5em);} 18div.column{flex: auto; overflow-x: auto;} 19div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;} 20ul.task-list{list-style: none;} 21ul.task-list li input[type="checkbox"] { 22 width: 0.8em; 23 margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */ 24 vertical-align: middle; 25} 26</style> 27 28
29<script src="site_libs/quarto-nav/quarto-nav.js"></script>
vendor: 1 bytes, line 29
29
30<script src="site_libs/quarto-nav/headroom.min.js"></script>
30 31<link href="./images/icon.png" rel="icon" type="image/png">
32<script src="site_libs/clipboard/clipboard.min.js"></script>
vendor: 1 bytes, line 32
32
33<script src="site_libs/quarto-html/quarto.js" type="module"></script>
vendor: 1 bytes, line 33
33
34<script src="site_libs/quarto-html/tabsets/tabsets.js" type="module"></script>
vendor: 1 bytes, line 34
34
35<script src="site_libs/quarto-html/popper.min.js"></script>
vendor: 1 bytes, line 35
35
36<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
36 37<link href="site_libs/quarto-html/tippy.css" rel="stylesheet"> 38<link href="site_libs/quarto-html/quarto-syntax-highlighting-7f8f88aac4f3542376d5c11b86a4c14d.css" rel="stylesheet" id="quarto-text-highlighting-styles">
39<script src="site_libs/bootstrap/bootstrap.min.js"></script>
39 40<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet"> 41<link href="site_libs/bootstrap/bootstrap-2f324a3e2402b1b1411e6a4607dc701e.min.css" rel="stylesheet" append-hash="true" id="quarto-bootstrap" data-mode="light"> 42<link href="site_libs/quarto-contrib/fontawesome6-6.7.2/all.min.css" rel="stylesheet"> 43<link href="site_libs/quarto-contrib/fontawesome6-6.7.2/latex-fontsize.css" rel="stylesheet">
44<script id="quarto-search-options" type="application/json">{ 45 "language": { 46 "search-no-results-text": "No results", 47 "search-matching-documents-text": "matching documents", 48 "search-copy-link-title": "Copy link to search", 49 "search-hide-matches-text": "Hide additional matches", 50 "search-more-match-text": "more match in this document", 51 "search-more-matches-text": "more matches in this document", 52 "search-clear-button-title": "Clear", 53 "search-text-placeholder": "", 54 "search-detached-cancel-button-title": "Cancel", 55 "search-submit-button-title": "Submit", 56 "search-label": "Search" 57 } 58}</script>
58 59 60 61<link rel="stylesheet" href="styles.css"> 62<meta property="og:title" content="Eleanor Jackson"> 63<meta property="og:description" content="Postdoctoral Researcher, Department of Biology, University of Oxford"> 64<meta property="og:image" content="https://eleanorjackson.com/images/meadow.jpg"> 65<meta property="og:site_name" content="Eleanor Jackson"> 66<meta property="og:locale" content="en_GB"> 67</head> 68 69<body class="nav-fixed fullcontent quarto-light"> 70 71<div id="quarto-search-results"></div> 72 <header id="quarto-header" class="headroom fixed-top"> 73 <nav class="navbar navbar-expand-lg " data-bs-theme="dark"> 74 <div class="navbar-container container-fluid"> 75 <div class="navbar-brand-container mx-auto"> 76 <a class='navbar-brand navbar-brand-logo' href='/'> 77 <img src="./images/logo.png" alt="" class="navbar-logo light-content"> 78 <img src="./images/logo.png" alt="" class="navbar-logo dark-content"> 79 </a> 80 </div> 81 <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(); }"> 82 <span class="navbar-toggler-icon"></span> 83</button> 84 <div class="collapse navbar-collapse" id="navbarCollapse"> 85 <ul class="navbar-nav navbar-nav-scroll me-auto"> 86 <li class="nav-item"> 87 <a class='nav-link' href='/publications'> 88<span class="menu-text">Publications</span></a> 89 </li> 90</ul> 91 </div> <!-- /navcollapse --> 92 <div class="quarto-navbar-tools"> 93</div> 94 </div> <!-- /container-fluid --> 95 </nav> 96</header> 97<!-- content --> 98<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-article page-navbar"> 99<!-- sidebar --> 100<!-- margin-sidebar --> 101 102<!-- main --> 103<div class="quarto-about-solana column-body"> 104 <div class="about-entity"> 105 <div class="entity-contents"> 106 <header id="title-block-header" class="quarto-title-block default"> 107<div class="quarto-title"> 108<h1 class="title">Dr. Eleanor E. Jackson</h1> 109<p class="subtitle lead">Postdoctoral Researcher, Department of Biology, University of Oxford</p> 110</div> 111<div class="quarto-title-meta"> 112 </div> 113</header> <div class="about-links"> 114 <a href="https://github.com/ee-jackson" class="about-link" rel="" target=""> 115 <i class="bi bi-github"></i> 116 <span class="about-link-text">GitHub</span> 117 </a> 118 <a href="https://orcid.org/0000-0002-9884-2972" class="about-link" rel="" target=""> 119 <i class="bi bi-orcid"></i> 120 <span class="about-link-text"><i class="fa-brands fa-orcid" aria-label="orcid"></i> Orcid</span> 121 </a> 122 <a href="https://scholar.google.com/citations?hl=en&user=i0GQDOkAAAAJ" class="about-link" rel="" target=""> 123 <i class="bi bi-scholar"></i> 124 <span class="about-link-text"><i class="fa-brands fa-google-scholar" aria-label="google-scholar"></i> Scholar</span> 125 </a> 126 <a href="https://bsky.app/profile/eleanorjackson.com" class="about-link" rel="" target=""> 127 <i class="bi bi-bluesky"></i> 128 <span class="about-link-text">Bluesky</span> 129 </a> 130 <a href="mailto:[email protected]" class="about-link" rel="" target=""> 131 <i class="bi bi-envelope"></i> 132 <span class="about-link-text">Email</span> 133 </a> 134</div> 135 <div class="about-contents"><main class="content" id="quarto-document-content"> 136<p>Hello! Iâm a research scientist <a href="https://www.biology.ox.ac.uk/people/eleanor-jackson">at the University of Oxford</a>, where I study how tree diversity influences aboveground biomass recovery in logged tropical forests.</p> 137<p>I hold a PhD from the <em>Quantitative Modelling in Ecology and Evolution</em> NERC CDT at the University of Reading, a MRes in <em>Biodiversity, Evolution and Conservation</em> from University College London and a BSc in <em>Zoology</em> from the University of Exeter.</p> 138<p>Broadly, my interests lie in quantitative and community ecology â utilising maths and statistics to understand how species interact and coexist. Iâm particularly excited by:</p> 139<ul> 140<li>Tropical forests</li> 141<li>Interactions between plants & their natural enemies</li> 142<li>Species coexistence and conspecific density-dependence</li> 143<li>Complex ecological data and Bayesian modelling</li> 144<li>Open & reproducible science</li> 145</ul> 146 147 148</main></div> 149 </div> 150 <img src="images/meadow.jpg" class="about-image 151 rounded " style="width: 16em;"> 152 </div> 153</div> 154 <!-- /main -->
155<script id="quarto-html-after-body" type="application/javascript"> 156 window.document.addEventListener("DOMContentLoaded", function (event) { 157 const isCodeAnnotation = (el) => { 158 for (const clz of el.classList) { 159 if (clz.startsWith('code-annotation-')) { 160 return true; 161 } 162 } 163 return false; 164 } 165 const onCopySuccess = function(e) { 166 // button target 167 const button = e.trigger; 168 // don't keep focus 169 button.blur(); 170 // flash "checked" 171 button.classList.add('code-copy-button-checked'); 172 var currentTitle = button.getAttribute("title"); 173 button.setAttribute("title", "Copied!"); 174 let tooltip; 175 if (window.bootstrap) { 176 button.setAttribute("data-bs-toggle", "tooltip"); 177 button.setAttribute("data-bs-placement", "left"); 178 button.setAttribute("data-bs-title", "Copied!"); 179 tooltip = new bootstrap.Tooltip(button, 180 { trigger: "manual", 181 customClass: "code-copy-button-tooltip", 182 offset: [0, -8]}); 183 tooltip.show(); 184 } 185 setTimeout(function() { 186 if (tooltip) { 187 tooltip.hide(); 188 button.removeAttribute("data-bs-title"); 189 button.removeAttribute("data-bs-toggle"); 190 button.removeAttribute("data-bs-placement"); 191 } 192 button.setAttribute("title", currentTitle); 193 button.classList.remove('code-copy-button-checked'); 194 }, 1000); 195 // clear code selection 196 e.clearSelection(); 197 } 198 const getTextToCopy = function(trigger) { 199 const outerScaffold = trigger.parentElement.cloneNode(true); 200 const codeEl = outerScaffold.querySelector('code'); 201 for (const childEl of codeEl.children) { 202 if (isCodeAnnotation(childEl)) { 203 childEl.remove(); 204 } 205 } 206 return codeEl.innerText; 207 } 208 const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', { 209 text: getTextToCopy 210 }); 211 clipboard.on('success', onCopySuccess); 212 if (window.document.getElementById('quarto-embedded-source-code-modal')) { 213 const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', { 214 text: getTextToCopy, 215 container: window.document.getElementById('quarto-embedded-source-code-modal') 216 }); 217 clipboardModal.on('success', onCopySuccess); 218 } 219 var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//); 220 var mailtoRegex = new RegExp(/^mailto:/); 221 var filterRegex = new RegExp("https:\/\/eleanorjackson\.com"); 222 var isInternal = (href) => { 223 return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href); 224 } 225 // Inspect non-navigation links and adorn them if external 226 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)'); 227 for (var i=0; i<links.length; i++) { 228 const link = links[i]; 229 if (!isInternal(link.href)) { 230 // undo the damage that might have been done by quarto-nav.js in the case of 231 // links that we want to consider external 232 if (link.dataset.originalHref !== undefined) { 233 link.href = link.dataset.originalHref; 234 } 235 } 236 } 237 function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) { 238 const config = { 239 allowHTML: true, 240 maxWidth: 500, 241 delay: 100, 242 arrow: false, 243 appendTo: function(el) { 244 return el.parentElement; 245 }, 246 interactive: true, 247 interactiveBorder: 10, 248 theme: 'quarto', 249 placement: 'bottom-start', 250 }; 251 if (contentFn) { 252 config.content = contentFn; 253 } 254 if (onTriggerFn) { 255 config.onTrigger = onTriggerFn; 256 } 257 if (onUntriggerFn) { 258 config.onUntrigger = onUntriggerFn; 259 } 260 window.tippy(el, config); 261 } 262 const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]'); 263 for (var i=0; i<noterefs.length; i++) { 264 const ref = noterefs[i]; 265 tippyHover(ref, function() { 266 // use id or data attribute instead here 267 let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href'); 268 try { href = new URL(href).hash; } catch {} 269 const id = href.replace(/^#\/?/, ""); 270 const note = window.document.getElementById(id); 271 if (note) { 272 return note.innerHTML; 273 } else { 274 return ""; 275 } 276 }); 277 } 278 const xrefs = window.document.querySelectorAll('a.quarto-xref'); 279 const processXRef = (id, note) => { 280 // Strip column container classes 281 const stripColumnClz = (el) => { 282 el.classList.remove("page-full", "page-columns"); 283 if (el.children) { 284 for (const child of el.children) {
285 stripColumnClz(child); 286 } 287 } 288 } 289 stripColumnClz(note) 290 if (id === null || id.startsWith('sec-')) { 291 // Special case sections, only their first couple elements 292 const container = document.createElement("div"); 293 if (note.children && note.children.length > 2) { 294 container.appendChild(note.children[0].cloneNode(true)); 295 for (let i = 1; i < note.children.length; i++) { 296 const child = note.children[i]; 297 if (child.tagName === "P" && child.innerText === "") { 298 continue; 299 } else { 300 container.appendChild(child.cloneNode(true)); 301 break; 302 } 303 } 304 if (window.Quarto?.typesetMath) { 305 window.Quarto.typesetMath(container); 306 } 307 return container.innerHTML 308 } else { 309 if (window.Quarto?.typesetMath) { 310 window.Quarto.typesetMath(note); 311 } 312 return note.innerHTML; 313 } 314 } else { 315 // Remove any anchor links if they are present 316 const anchorLink = note.querySelector('a.anchorjs-link'); 317 if (anchorLink) { 318 anchorLink.remove(); 319 } 320 if (window.Quarto?.typesetMath) { 321 window.Quarto.typesetMath(note); 322 } 323 if (note.classList.contains("callout")) { 324 return note.outerHTML; 325 } else { 326 return note.innerHTML; 327 } 328 } 329 } 330 for (var i=0; i<xrefs.length; i++) { 331 const xref = xrefs[i]; 332 tippyHover(xref, undefined, function(instance) { 333 instance.disable(); 334 let url = xref.getAttribute('href'); 335 let hash = undefined; 336 if (url.startsWith('#')) { 337 hash = url; 338 } else { 339 try { hash = new URL(url).hash; } catch {} 340 } 341 if (hash) { 342 const id = hash.replace(/^#\/?/, ""); 343 const note = window.document.getElementById(id); 344 if (note !== null) { 345 try { 346 const html = processXRef(id, note.cloneNode(true)); 347 instance.setContent(html); 348 } finally { 349 instance.enable(); 350 instance.show(); 351 } 352 } else { 353 // See if we can fetch this 354 fetch(url.split('#')[0]) 355 .then(res => res.text()) 356 .then(html => { 357 const parser = new DOMParser(); 358 const htmlDoc = parser.parseFromString(html, "text/html"); 359 const note = htmlDoc.getElementById(id); 360 if (note !== null) { 361 const html = processXRef(id, note); 362 instance.setContent(html); 363 } 364 }).finally(() => { 365 instance.enable(); 366 instance.show(); 367 }); 368 } 369 } else { 370 // See if we can fetch a full url (with no hash to target) 371 // This is a special case and we should probably do some content thinning / targeting 372 fetch(url) 373 .then(res => res.text()) 374 .then(html => { 375 const parser = new DOMParser(); 376 const htmlDoc = parser.parseFromString(html, "text/html"); 377 const note = htmlDoc.querySelector('main.content'); 378 if (note !== null) { 379 // This should only happen for chapter cross references 380 // (since there is no id in the URL) 381 // remove the first header 382 if (note.children.length > 0 && note.children[0].tagName === "HEADER") { 383 note.children[0].remove(); 384 } 385 const html = processXRef(null, note); 386 instance.setContent(html); 387 } 388 }).finally(() => { 389 instance.enable(); 390 instance.show(); 391 }); 392 } 393 }, function(instance) { 394 }); 395 } 396 let selectedAnnoteEl; 397 const selectorForAnnotation = ( cell, annotation) => { 398 let cellAttr = 'data-code-cell="' + cell + '"'; 399 let lineAttr = 'data-code-annotation="' + annotation + '"'; 400 const selector = 'span[' + cellAttr + '][' + lineAttr + ']'; 401 return selector; 402 } 403 const selectCodeLines = (annoteEl) => { 404 const doc = window.document; 405 const targetCell = annoteEl.getAttribute("data-target-cell"); 406 const targetAnnotation = annoteEl.getAttribute("data-target-annotation"); 407 const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation)); 408 const lines = annoteSpan.getAttribute("data-code-lines").split(","); 409 const lineIds = lines.map((line) => { 410 return targetCell + "-" + line; 411 }) 412 let top = null; 413 let height = null; 414 let parent = null; 415 if (lineIds.length > 0) { 416 //compute the position of the single el (top and bottom and make a div) 417 const el = window.document.getElementById(lineIds[0]); 418 top = el.offsetTop; 419 height = el.offsetHeight; 420 parent = el.parentElement.parentElement; 421 if (lineIds.length > 1) { 422 const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]); 423 const bottom = lastEl.offsetTop + lastEl.offsetHeight; 424 height = bottom - top; 425 } 426 if (top !== null && height !== null && parent !== null) { 427 // cook up a div (if necessary) and position it 428 let div = window.document.getElementById("code-annotation-line-highlight"); 429 if (div === null) { 430 div = window.document.createElement("div"); 431 div.setAttribute("id", "code-annotation-line-highlight"); 432 div.style.position = 'absolute'; 433 parent.appendChild(div); 434 } 435 div.style.top = top - 2 + "px"; 436 div.style.height = height + 4 + "px"; 437 div.style.left = 0; 438 let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter"); 439 if (gutterDiv === null) { 440 gutterDiv = window.document.createElement("div"); 441 gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter"); 442 gutterDiv.style.position = 'absolute'; 443 const codeCell = window.document.getElementById(targetCell); 444 const gutter = codeCell.querySelector('.code-annotation-gutter'); 445 gutter.appendChild(gutterDiv); 446 } 447 gutterDiv.style.top = top - 2 + "px"; 448 gutterDiv.style.height = height + 4 + "px"; 449 } 450 selectedAnnoteEl = annoteEl; 451 } 452 }; 453 const unselectCodeLines = () => { 454 const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"]; 455 elementsIds.forEach((elId) => { 456 const div = window.document.getElementById(elId); 457 if (div) { 458 div.remove(); 459 } 460 }); 461 selectedAnnoteEl = undefined; 462 }; 463 // Handle positioning of the toggle 464 window.addEventListener( 465 "resize", 466 throttle(() => { 467 elRect = undefined; 468 if (selectedAnnoteEl) { 469 selectCodeLines(selectedAnnoteEl); 470 } 471 }, 10) 472 ); 473 function throttle(fn, ms) { 474 let throttle = false;
475 let timer; 476 return (...args) => { 477 if(!throttle) { // first call gets through 478 fn.apply(this, args); 479 throttle = true; 480 } else { // all the others get throttled 481 if(timer) clearTimeout(timer); // cancel #2 482 timer = setTimeout(() => { 483 fn.apply(this, args); 484 timer = throttle = false; 485 }, ms); 486 } 487 }; 488 } 489 // Attach click handler to the DT 490 const annoteDls = window.document.querySelectorAll('dt[data-target-cell]'); 491 for (const annoteDlNode of annoteDls) { 492 annoteDlNode.addEventListener('click', (event) => { 493 const clickedEl = event.target; 494 if (clickedEl !== selectedAnnoteEl) { 495 unselectCodeLines(); 496 const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active'); 497 if (activeEl) { 498 activeEl.classList.remove('code-annotation-active'); 499 } 500 selectCodeLines(clickedEl); 501 clickedEl.classList.add('code-annotation-active'); 502 } else { 503 // Unselect the line 504 unselectCodeLines(); 505 clickedEl.classList.remove('code-annotation-active'); 506 } 507 }); 508 } 509 const findCites = (el) => { 510 const parentEl = el.parentElement; 511 if (parentEl) { 512 const cites = parentEl.dataset.cites; 513 if (cites) { 514 return { 515 el, 516 cites: cites.split(' ') 517 }; 518 } else { 519 return findCites(el.parentElement) 520 } 521 } else { 522 return undefined; 523 } 524 }; 525 var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]'); 526 for (var i=0; i<bibliorefs.length; i++) { 527 const ref = bibliorefs[i]; 528 const citeInfo = findCites(ref); 529 if (citeInfo) { 530 tippyHover(citeInfo.el, function() { 531 var popup = window.document.createElement('div'); 532 citeInfo.cites.forEach(function(cite) { 533 var citeDiv = window.document.createElement('div'); 534 citeDiv.classList.add('hanging-indent'); 535 citeDiv.classList.add('csl-entry'); 536 var biblioDiv = window.document.getElementById('ref-' + cite); 537 if (biblioDiv) { 538 citeDiv.innerHTML = biblioDiv.innerHTML; 539 } 540 popup.appendChild(citeDiv); 541 }); 542 return popup.innerHTML; 543 }); 544 } 545 } 546 }); 547 </script>
547 548</div> <!-- /content --> 549<footer class="footer"> 550 <div class="nav-footer"> 551 <div class="nav-footer-left"> 552<i class="fa-regular fa-copyright" aria-label="copyright"></i> Eleanor Jackson,
553<script>document.write(/\d{4}/.exec(Date())[0])</script>
553 554</div> 555 <div class="nav-footer-center"> 556 557 </div> 558 <div class="nav-footer-right"> 559<p><a href="https://github.com/ee-jackson/quarto-site" title="source code"><i class="fa-solid fa-code" aria-label="code"></i></a></p> 560</div> 561 </div> 562</footer> 563 564 565 566
567<script data-goatcounter="https://eejackson.goatcounter.com/count" 568 async src="//gc.zgo.at/count.js"></script>
568</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.