PageSourceSearch

https://eleanorjackson.com/

html eleanorjackson.com collected 2026-09-25 22:31:43 UTC 23,065 bytes, 568 lines download raw bytes

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.&nbsp;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&amp;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 &amp; 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 &amp; 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      &nbsp;
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.