Online ecology - Individual species description

June 19, 2017

  R ecology open-data open-science
  biomod2 kableExtra knitr magrittr raster rfishbase rglobi robis sdmpredictors sf taxize

David Beauchesne, Kevin Cazelles, Rémi Daigle

   


Online ecology

Let’s imagine that we are interested in a species in a given area and wish to know as much as possible about it. But, you can’t go out in the field because funding is running short. What we do have, however, is a certain knowledge of the open data science tools that are at our disposal. In a series of post about online ecology, we will find out exactly just how far these tools allow us to delve into the ecology of the species that interest us.


Online ecology posts:


Individual species description

This post focuses on the simplest yet still complicated aspect of ecology, i.e. describing a species as thoroughly as possible with the tools at our disposal.

Special thanks to the developers at ROpenSci, who built many of the R package used to access the open access tools we present in this post.


Setting up R

R version used to build the last update of this post

1
2
sessionInfo()[[1]]$version.string
#R> [1] "R version 4.2.0 (2022-04-22)"

Defining species and area of interest

We start by selecting the species and the area in which we are interested. For this post, we focus on the Atlantic cod (Gadus morhua) in the estuary and gulf of St. Lawrence in eastern Canada.


Let’s set the parameters and create the spatial bounding box that we will be using for the area of interest. Note that all these parameters can be changed to extract information for other species in other habitats.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# Species of interest
    sp <- 'Gadus morhua'

# Extent of area of interest
    latmax <- 52.01312
    latmin <- 45.52399
    lonmax <- -55.73636
    lonmin <- -71.06333

# Create a spatial bounding box for the area of interest using the 'sf' package:
# create a matrix:
    bb <- cbind(c(lonmin,lonmax,lonmax,lonmin,lonmin),
                   c(latmin,latmin,latmax,latmax,latmin)) %>%
        # put that matrix into a list, because that's what `st_polygon()` needs
        list() %>%
        # Make the matrix a 'simple features' polygon:
        sf::st_polygon() %>%
        # and let's make it a simple feature column and give it information about the projection:
        sf::st_sfc(crs="+proj=longlat +datum=WGS84") %>%
        # finally, let's put the sfc in a simple features data.frame in the variable `geometry`:
        sf::st_sf(name="Study Site",geometry=.)

Describe your species

Retrieve miscellaneous ecological information: Fishbase

We’ll start with a description of the species. First, let’s see what fishbase has to offer. This online data repository, along with sealifebase, contains a lot of precious information on marine and aquatic species all over the world and is accessible through the package rfishbase


1
2
3
4
5
6
7
8
9
# Species ecology
ecol <- rfishbase::ecology(sp)
ecol <- cbind(colnames(ecol), t(ecol))
rownames(ecol) <- NULL
ecol <- ecol[ecol[,2] != 0, ] # remove 0
ecol <- ecol[!is.na(ecol[,2]), ] # remove NAs

knitr::kable(ecol, col.names = c('Descriptors', 'Attributes'), "html") %>%
    kableExtra::kable_styling(full_width = FALSE)

Descriptors

Attributes

SpecCode

69

Species

Gadus morhua

autoctr

33

StockCode

79

EcologyRefNo

1371

HabitatsRef

1371

Neritic

-1

Intertidal

-1

Oceanic

-1

Estuaries

-1

Herbivory2

mainly animals (troph. 2.8 and up)

HerbivoryRef

5743

FeedingType

hunting macrofauna (predator)

FeedingTypeRef

5743

DietTroph

4.09

DietSeTroph

0.179

DietTLu

4.34

DietseTLu

0.72

DietRemark

Troph of adults from 7 studies.

DietRef

26813

FoodTroph

4.29

FoodSeTroph

1

FoodRemark

Trophic level estimated from a number of food items using a randomized resampling routine.

AddRems

Opportunistic predator that forages mainly at dawn and dusk (Refs. 1371, 46189). Larvae feed mainly on zooplankton while juveniles prey predominantly on benthic crustaceans; adults feed mainly on zoobenthos and fish (Refs. 5743, 9604, 26813) including juvenile cod. Fish prey becomes more common in the diet with increasing body size (Refs. 1371, 89387). Adults may cover large distances during the feeding period (Ref. 89387). Young cod are also preyed upon by different fish species and octopus. Adult cod are prey items of top predators like sharks, rays, whales, dolphins, seals, and sea birds (Refs. 9023, 9581, 26954, 43651, 45735). In the Baltic it grows up to 5 kg weight in 7-8 years; in the North Sea it reaches 8 kg in the same time span . Natural mortality for adults of both stocks is assumed to be around M=0.2, resulting in a mean adult life expectancy and mean duration of the reproductive phase of 5 years (Ref. 88171). Parasites of the species include protozoans (trypanosome), myxosporidians, monogeneid, trematodes, cestodes, nematodes, acanthocephalan, hirudinid and copepods (Ref. 5951).

Schooling

-1

SchoolingFrequency

sometimes

SchoolingLifestage

juveniles and adults

SchoolShoalRef

1371

AssociationsRemarks

Generally considered a demersal fish although its habitat may become pelagic under certain hydrographic conditions when feeding or spawning. There is some evidence that cod leave the bottom and school pelagically to spawn in preferred temperatures when bottom tempetatures are unsuitable. Gregarious during the day, forming compact schools that swim between 30-80 m above the bottom, and scatter at night (Ref. 1371). Schooling behavior may be adaptive for feeding. Reproductive behavior during spawning involves the circling of a female often by only one male per spawning bout (Ref. 86779).

SoftBottom

-1

HardBottom

-1

Rocky

-1

SeaGrassBeds

-1

Entered

2

Dateentered

1991-10-17

Modified

2495

Datemodified

2020-11-25


Retrieving taxonomic information: Taxize

We can also extract taxonomic information using the package taxize. This package allows you to extract and validate, among other things, the taxonomy of millions of species by accessing an important number of online databases accessible through their Application Programming Interface (API).


1
2
3
# Export the taxonomy of the species of interest
taxize::classification(sp, db = 'worms', accepted = TRUE, verbose = FALSE)[[1]] %>%
    knitr::kable("html") %>% kableExtra::kable_styling(full_width = FALSE)

══ 1 queries ═══════════════ ✔ Found: Gadus morhua ══ Results ═════════════════

• Total: 1 • Found: 1 • Not Found: 0

name

rank

id

Animalia

Kingdom

2

Chordata

Phylum

1821

Vertebrata

Subphylum

146419

Gnathostomata

Infraphylum

1828

Osteichthyes

Parvphylum

152352

Actinopterygii

Gigaclass

10194

Actinopteri

Class

843664

Teleostei

Subclass

293496

Gadiformes

Order

10313

Gadidae

Family

125469

Gadus

Genus

125732

Gadus morhua

Species

126436


1
2
3
4
5
6
7
8
9
# Retrieve a tsn for Gadus morhua, i.e. an unique identifier from the itis db
idtsn <- taxize::get_tsn(sp, accepted=TRUE, verbose = FALSE, row=1)[1]
#R> ══  1 queries  ═══════════════
#R> ✔  Found:  Gadus morhua
#R> ══  Results  ═════════════════
#R> 
#R> • Total: 1 
#R> • Found: 1 
#R> • Not Found: 0
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# We can also extract the common or scientific names using sci2comm() & comm2sci(), respectively.
taxize::sci2comm(taxize::as.tsn(idtsn), db = 'itis')
#R> $`164712`
#R> [1] "morue de l'Atlantique" "bacalao del Atlántico" "cod"                  
#R> [4] "rock cod"              "morue franche"         "Atlantic cod"

# Or find out whether there are other names under which the species is known
taxize::synonyms(taxize::as.tsn(idtsn), db = 'itis')
#R> $`164712`
#R> data frame with 0 columns and 0 rows
1
2
3
4
5
# Another really interesting feature is to extract all known species at a given
# taxonomic scale. With the itis db, you should first find the tsn associated
# with Gadus. Using `taxize::get_tsn('gadus')` you'll find out that it is 164710
knitr::kable(taxize::children(164710, db = 'itis')[[1]], "html") %>%
  kableExtra::kable_styling(full_width = FALSE)

parentname

parenttsn

rankname

taxonname

tsn

Gadus

164710

Species

Gadus macrocephalus

164711

Gadus

164710

Species

Gadus morhua

164712

Gadus

164710

Species

Gadus ogac

164717

Gadus

164710

Species

Gadus chalcogrammus

934083

Sounds like this is consistent with what Wikipedia says!


Retrieving trophic informations: GloBI

We can also retrieve information on known biotic interactions involving our species of interest. The Global Biotic Interactions web platform contains thousands of empirical binary interactions for multiple types of interactions, all over the world, and is accessible using the package rglobi.


1
2
3
# There are multiple types of interactions available on GloBI
    knitr::kable(rglobi::get_interaction_types()[,1:3], 'html') %>%
        kable_styling(full_width = FALSE)

interaction

source

target

eats

consumer

food

eatenBy

food

consumer

preysOn

predator

prey

preyedUponBy

prey

predator

kills

killer

victim

killedBy

victim

killer

parasiteOf

parasite

host

hasParasite

host

parasite

endoparasiteOf

endoparasite

host

hasEndoparasite

host

endoparasite

ectoparasiteOf

ectoparasite

host

hasEctoparasite

host

ectoparasite

parasitoidOf

parasitoid

host

hasParasitoid

host

parasitoid

hostOf

host

symbiont

hasHost

symbiont

host

pollinates

pollinator

plant

pollinatedBy

plant

pollinator

pathogenOf

pathogen

host

hasPathogen

host

pathogen

vectorOf

vector

pathogen

hasVector

pathogen

vector

dispersalVectorOf

vector

seed

hasDispersalVector

seed

vector

hasHabitat

inhabitant

habitat

createsHabitatFor

habitat

inhabitant

epiphyteOf

plant/algae

host plant

hasEpiphyte

plant

plant/algae

providesNutrientsFor

host

consumer

acquiresNutrientsFrom

consumer

host

symbiontOf

symbiont

symbiont

mutualistOf

mutualist

mutualist

commensalistOf

commensalist

commensalist

flowersVisitedBy

plant

visitor

visitsFlowersOf

visitor

plant

ecologicallyRelatedTo

source

target

coOccursWith

source

target

coRoostsWith

source

target

interactsWith

source

target

adjacentTo

source

target

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# For now let's focus on predator-prey interactions
    prey <- rglobi::get_prey_of(sp)$target_taxon_name # Retrieve prey
    pred <- rglobi::get_predators_of(sp)$target_taxon_name # Retrieve predators
    length(prey) # Number of prey
#R> [1] 672
    length(pred) # Number of predators
#R> [1] 83
    prey[1:20] # First 20 prey
#R>  [1] "Eryhtrops erythrophthalma"         "Boremysis arctica"                
#R>  [3] "Onisimus littoralis"               "Eumicotremus derjugini"           
#R>  [5] "Eualus gaimardi"                   "Hipoglossoides platessoides"      
#R>  [7] "Diastylis rathkii"                 "Diaphanosoma leuchtenbergia"      
#R>  [9] "Paracyclops fibriatus"             "Processa modica modica"           
#R> [11] "Processa nouveli holthuisi"        "Amphiura filiformis"              
#R> [13] "Philocheras bispinosus bispinosus" "Astropecten irregularis"          
#R> [15] "Alosa fallax"                      "Ammodytes tobianus"               
#R> [17] "Liocarcinus holsatus"              "Crangon allmanni"                 
#R> [19] "Potamyia"                          "Corystes cassivelaunus"
    pred[1:20] # First 20 predators
#R>  [1] "Scomber scombrus"           "Chelidonichthys lucerna"   
#R>  [3] "Anarhichas lupus"           "Eutrigla gurnardus"        
#R>  [5] "Merlangius merlangus"       "Scophthalmus rhombus"      
#R>  [7] "Scophthalmus maximus"       "Phoca vitulina"            
#R>  [9] "Larus hyperboreus"          "Hirudinea"                 
#R> [11] "Phalacrocorax carbo"        "Phoca vitulina"            
#R> [13] "Scomber scombrus"           "Chroicocephalus ridibundus"
#R> [15] "Eutrigla gurnardus"         "Chelidonichthys lucerna"   
#R> [17] "Thunnus thynnus"            "Fulmarus glacialis"        
#R> [19] "Merlangius merlangus"       "Hirudinea"

Making our search spatially explicit

Since we are interested in a specific area, making our search spatially explicit would be highly valuable. Luckily, there are tools that allow us to do just that.


Retrieving: occurrence data: OBIS & GBIF

OBIS is the Ocean Biogeographic Information System and their vision is: “To be the most comprehensive gateway to the world’s ocean biodiversity and biogeographic data and information required to address pressing coastal and world ocean concerns.” We can get access to their HUGE database through the robis package.

Similarly, GBIF is the Global Biodiversity Information Facility and it aims at providing free and open access to biodiversity data. This open source platform can be accessed through the rgbif package.

We only cover the OBIS package in this post since the targeted species is marine, but visit rgbif github repository for more information on its use.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# Download occurrence data for species and area of interest between 2010 and 2017
    OBIS <- robis::occurrence(scientificname = sp, geometry=sf::st_as_text(bb$geometry), startdate = as.Date("2010-01-01"), enddate = as.Date("2017-01-01"))

# Remove duplicates
    OBIS <- unique(OBIS)

# Transform as spatial file
    OBIS <- sf::st_as_sf(OBIS,
                     coords = c("decimalLongitude", "decimalLatitude"),
                     crs="+proj=longlat +datum=WGS84",
                     remove=FALSE)

# Visualize with mapview
    mapview::mapview(OBIS, cex = 4)@map

Retrieving environmental data: sdmpredictors

There are multiple resources available to access environmental data directly through R. Bathymetry data can be accessed using the marmap package. Other environmental data can also be accessed using other packages like raster for terrestrial climatic data (i.e. bioclim) and rnoaa for some environmental layers like sea surface temperature and sea ice cover. Finally, a precious resource is the recently published sdmpredictors package, which provides access to multiple important global environmental datasets for marine and terrestrial environments and a total of 1367


1
2
3
# List sdmpredictors datasets
    knitr::kable(sdmpredictors::list_datasets()[,1:4], 'html') %>%
        kable_styling(full_width = FALSE)

dataset_code

terrestrial

marine

url

WorldClim

TRUE

FALSE

http://www.worldclim.org/

Bio-ORACLE

FALSE

TRUE

hhtp://bio-oracle.org/

MARSPEC

FALSE

TRUE

http://marspec.org/

ENVIREM

TRUE

FALSE

https://envirem.github.io/

Freshwater

TRUE

FALSE

https://www.earthenv.org/streams

1
  # issues with the above if all columns included

We can then import environmental data using the sdmpredictors() function. Since our study area of interest is marine, we will select environmental variables accordingly from the Bio-ORACLE dataset, although data from MARSPEC could also be used.


1
2
3
4
5
# Import marine layers
  layers <- c('BO_chlomean','BO_dissox','BO_ph','BO_salinity','BO_sstmean','BO_bathymean')
# layers <- 'BO_ph'
  dir.create("downloaded_predictors/", showWarnings = FALSE)
  envCov <- sdmpredictors::load_layers(layers, datadir = "downloaded_predictors/", rasterstack = TRUE)

Clip them and plot them:


1
2
3
4
# Clip to study area extent
envCov <- raster::stack(
    raster::crop(envCov, raster::extent(lonmin, lonmax, latmin, latmax))
  )
1
2
3
# Data description
knitr::kable(sdmpredictors::get_layers_info(layers)$current[,1:4], 'html') %>%
  kable_styling()

dataset_code

layer_code

name

description

71

Bio-ORACLE

BO_chlomean

Chlorophyll A (mean)

Chlorophyll A concentration indicates the concentration of photosynthetic pigment chlorophyll A (the most common green chlorophyll) in oceans. Please note that in shallow water these values may reflect any kind of autotrophic biomass.

79

Bio-ORACLE

BO_dissox

Dissolved oxygen

Dissolved oxygen concentration [02]

83

Bio-ORACLE

BO_ph

pH

Measure of acidity in the ocean.

85

Bio-ORACLE

BO_salinity

Salinity

Salinity indicates the dissolved salt content in the ocean.

88

Bio-ORACLE

BO_sstmean

Sea surface temperature (mean)

Sea surface temperature is the temperature of the water at the ocean surface. This parameter indicates the temperature of the topmost meter of the ocean water column.

93

Bio-ORACLE

BO_bathymean

Bathymetry (mean)

Average depth of the seafloor

1
2
# Plot 'em!
  raster::plot(envCov)

Evaluating species distribution models: biomod2

Now that we have species occurrence and environmental data, we can evaluate species distribution models (SDMs). There are multiple ways and packages to perform SDMs and this post vignette provides an extensive overview of the different methods available. For this blog post, we will be using the package biomod2, which implements most of the methods presented in the vignette. There is also a thorough explanation of our to use biomod2 in another very interesting vignette.


Formatting the data

The first thing to do is to format our data to be able to work with biomod2 functions, which work with BIOMOD.formated.data.PA class objects. This entails stacking all of our environmental data together to perform analyses. Luckily this was accomplished previously when extracting environmental data using the sdmpredictors package. You can then create your biomod2 data class…


1
2
3
4
5
SDMdata <- biomod2::BIOMOD_FormatingData(resp.var = rep(1,nrow(OBIS)),
                                        expl.var = envCov,
                                        resp.xy = data.frame(OBIS$decimalLongitude, OBIS$decimalLatitude),
                                        resp.name = sp,
                                        PA.nb.rep = 1)

…use this object with the biomod2 functions to generate a distribution model for your species of interest…


1
2
3
4
5
6
7
8

SDM <- biomod2::BIOMOD_Modeling(
            data = SDMdata,
            models = "RF",
            # models = "MAXENT.Tsuruoka",
            # Basic options for modelling
            model.options = biomod2::BIOMOD_ModelingOptions(),
            SaveObj = FALSE)

…extract the evaluation of the fit of your model…


1
2
3
# Model evaluation
  knitr::kable(biomod2::get_evaluations(SDM), 'html')  %>%
      kable_styling(full_width = FALSE)

Testing.data.RF.Full.PA1

Cutoff.RF.Full.PA1

Sensitivity.RF.Full.PA1

Specificity.RF.Full.PA1

KAPPA

0.982

535

99.564

98.7

TSS

0.986

566

99.346

99.2

ROC

1.000

567

99.315

99.3


… and finally, once the models are calibrated and evaluated, you can project your species spatial distribution:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Model spatial projection
  SDMproj <- biomod2::BIOMOD_Projection(modeling.output = SDM,
                                        new.env = envCov,
                                        proj.name = 'Awesome!',
                                        selected.models = 'all',
                                        binary.meth = 'TSS',
                                        compress = 'xz',
                                        clamping.mask = F,
                                        output.format = '.grd')
# ... and visualize them!
  biomod2::plot(SDMproj)

Riveting!


Concluding remarks

Starting with a very basic idea, i.e. describing the ecology of a species in a given area, we ended up with a species description, some known occurrences, environmental data describing our area of interest and the potential spatial distribution of our species!

…but should we stop there?

The reality is, there is so much more going on in our area of interest than the spatial distribution of a single species. In the next post, we will look into community scale analyses using some of the tools presented in this post, alongside some new ones specifically designed for community ecology.

Session info
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
sessionInfo()
#R> R version 4.2.0 (2022-04-22)
#R> Platform: x86_64-pc-linux-gnu (64-bit)
#R> Running under: Debian GNU/Linux bookworm/sid
#R> 
#R> Matrix products: default
#R> BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.10.1
#R> LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.10.1
#R> 
#R> locale:
#R>  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
#R>  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
#R>  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
#R>  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
#R>  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
#R> [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
#R> 
#R> attached base packages:
#R> [1] stats     graphics  grDevices utils     datasets  methods   base     
#R> 
#R> other attached packages:
#R> [1] kableExtra_1.3.4       knitr_1.39             magrittr_2.0.3        
#R> [4] raster_3.5-15          sp_1.4-7               inSilecoRef_0.0.1.9000
#R> 
#R> loaded via a namespace (and not attached):
#R>   [1] utf8_1.2.2              tidyselect_1.1.2        htmlwidgets_1.5.4      
#R>   [4] grid_4.2.0              pROC_1.18.0             munsell_0.5.0          
#R>   [7] base64url_1.4           codetools_0.2-18        units_0.8-0            
#R>  [10] DT_0.23                 future_1.25.0           miniUI_0.1.1.1         
#R>  [13] withr_2.5.0             colorspace_2.0-3        highr_0.9              
#R>  [16] uuid_1.0-4              rstudioapi_0.13         stats4_4.2.0           
#R>  [19] listenv_0.8.0           conditionz_0.1.0        TeachingDemos_2.12     
#R>  [22] urltools_1.7.3          rfishbase_4.0.0         ENMeval_2.0.3          
#R>  [25] bit64_4.0.5             parallelly_1.31.1       vctrs_0.4.1            
#R>  [28] ritis_1.0.0             generics_0.1.2          ipred_0.9-12           
#R>  [31] xfun_0.30               worrms_0.4.2            randomForest_4.7-1.1   
#R>  [34] R6_2.5.1                taxize_0.9.100          sdmpredictors_0.2.12   
#R>  [37] targets_0.12.0          bitops_1.0-7            cachem_1.0.6           
#R>  [40] reshape_0.8.9           assertthat_0.2.1        promises_1.2.0.1       
#R>  [43] scales_1.2.0            vroom_1.5.7             rcrossref_1.1.0        
#R>  [46] nnet_7.3-17             gtable_0.3.0            globals_0.15.0         
#R>  [49] processx_3.5.3          bold_1.2.0              leafpop_0.1.0          
#R>  [52] mda_0.5-3               timeDate_3043.102       rlang_1.0.2            
#R>  [55] mapedit_0.6.0           systemfonts_1.0.4       splines_4.2.0          
#R>  [58] rgdal_1.5-32            duckdb_0.3.2-2          ModelMetrics_1.2.2.2   
#R>  [61] hexbin_1.28.2           earth_5.3.1             mapview_2.11.0         
#R>  [64] brew_1.0-7              checkmate_2.1.0         reshape2_1.4.4         
#R>  [67] biomod2_3.5.1           yaml_2.3.5              abind_1.4-5            
#R>  [70] crosstalk_1.2.0         backports_1.4.1         httpuv_1.6.5           
#R>  [73] caret_6.0-92            lava_1.6.10             tools_4.2.0            
#R>  [76] bookdown_0.26           ggplot2_3.3.6           rglobi_0.2.27          
#R>  [79] ellipsis_0.3.2          jquerylib_0.1.4         RColorBrewer_1.1-3     
#R>  [82] proxy_0.4-26            Rcpp_1.0.8.3            plyr_1.8.7             
#R>  [85] base64enc_0.1-3         progress_1.2.2          classInt_0.4-3         
#R>  [88] purrr_0.3.4             RCurl_1.98-1.6          ps_1.7.0               
#R>  [91] robis_2.8.2             prettyunits_1.1.1       rpart_4.1.16           
#R>  [94] openssl_2.0.1           zoo_1.8-10              contentid_0.0.15       
#R>  [97] fs_1.5.2                leafem_0.2.0            crul_1.2.0             
#R> [100] data.table_1.14.2       blogdown_1.10           triebeard_0.3.0        
#R> [103] hms_1.1.1               mime_0.12               evaluate_0.15          
#R> [106] xtable_1.8-4            leaflet_2.1.1           jpeg_0.1-9             
#R> [109] compiler_4.2.0          tibble_3.1.6            KernSmooth_2.23-20     
#R> [112] crayon_1.5.1            htmltools_0.5.2         mgcv_1.8-40            
#R> [115] later_1.3.0             tzdb_0.3.0              Formula_1.2-4          
#R> [118] tidyr_1.2.0             lubridate_1.8.0         DBI_1.1.2              
#R> [121] dbplyr_2.1.1            MASS_7.3-57             solrium_1.2.0          
#R> [124] sf_1.0-7                Matrix_1.4-1            readr_2.1.2            
#R> [127] cli_3.3.0               gower_1.0.0             parallel_4.2.0         
#R> [130] igraph_1.2.11           pkgconfig_2.0.3         RefManageR_1.3.0       
#R> [133] recipes_0.2.0           terra_1.5-21            xml2_1.3.3             
#R> [136] foreach_1.5.2           svglite_2.1.0           hardhat_0.2.0          
#R> [139] bslib_0.3.1             webshot_0.5.3           prodlim_2019.11.13     
#R> [142] plotmo_3.6.1            rvest_1.0.2             stringr_1.4.0          
#R> [145] callr_3.7.0             digest_0.6.29           httpcode_0.3.0         
#R> [148] rmarkdown_2.14          PresenceAbsence_1.1.10  curl_4.3.2             
#R> [151] shiny_1.7.1             satellite_1.0.4         dismo_1.3-5            
#R> [154] lifecycle_1.0.1         nlme_3.1-157            jsonlite_1.8.0         
#R> [157] viridisLite_0.4.0       askpass_1.1             fansi_1.0.3            
#R> [160] pillar_1.7.0            lattice_0.20-45         fastmap_1.1.0          
#R> [163] httr_1.4.3              plotrix_3.8-2           survival_3.3-1         
#R> [166] rasterVis_0.51.2        glue_1.6.2              gbm_2.1.8              
#R> [169] png_0.1-7               iterators_1.0.14        leaflet.providers_1.9.0
#R> [172] bit_4.0.4               class_7.3-20            stringi_1.7.6          
#R> [175] sass_0.4.1              maxnet_0.1.4            latticeExtra_0.6-29    
#R> [178] memoise_2.0.1           dplyr_1.0.9             future.apply_1.9.0     
#R> [181] e1071_1.7-9             ape_5.6-2