The World Checklist of Vascular Plants (WCVP) is a global consensus view of all known vascular plant species. It has been compiled by staff at RBG Kew in consultation with plant group experts.
The WCVP is a taxonomic database, and as such contains information like the taxonomic status and synonymy of plant names. It can be used for a number of tasks, including searching for all records with a particular name, getting a list of all accepted species in a genus, or looking up the accepted name for a species.
Searching in WCVP works by exact matching. This means that a misspelled name will not return any results.
For instance, searching for Poa anua
gets nothing:
results <- search_wcvp("Poa anua")
results
#> <WCVP search: 'Poa anua' filters: 'none'>
#> total results: 0
#> returned results: 0
#> total pages: 0
#> current page: 0
#> list()
But searching for the correctly spelled name will give a result:
results <- search_wcvp("Poa annua")
results
#> <WCVP search: 'Poa annua' filters: 'none'>
#> total results: 10
#> returned results: 10
#> total pages: 1
#> current page: 1
#> List of 1
#> $ :List of 9
#> ..$ id : chr "320035-2"
#> ..$ fqId : chr "urn:lsid:ipni.org:names:320035-2"
#> ..$ url : chr "/taxon/320035-2"
#> ..$ display : chr "<b><i>Poa annua</i> L.</b>"
#> ..$ accepted: logi TRUE
#> ..$ family : chr "Poaceae"
#> ..$ name : chr "Poa annua"
#> ..$ author : chr "L."
#> ..$ rank : chr "Species"
Similarly, searching with partial matching does not work:
results <- search_wcvp("Ulex e")
results
#> <WCVP search: 'Ulex e' filters: 'none'>
#> total results: 0
#> returned results: 0
#> total pages: 0
#> current page: 0
#> list()
But searching for a genus name will return all taxa within that genus as well:
results <- search_wcvp("Ulex")
results
#> <WCVP search: 'Ulex' filters: 'none'>
#> total results: 93
#> returned results: 50
#> total pages: 2
#> current page: 2
#> List of 1
#> $ :List of 9
#> ..$ id : chr "23746-1"
#> ..$ fqId : chr "urn:lsid:ipni.org:names:23746-1"
#> ..$ url : chr "/taxon/23746-1"
#> ..$ display : chr "<b><i>Ulex</i> L.</b>"
#> ..$ accepted: logi TRUE
#> ..$ family : chr "Fabaceae"
#> ..$ name : chr "Ulex"
#> ..$ author : chr "L."
#> ..$ rank : chr "Genus"
With this search result, we can see that there are 92 records for Ulex
but the API has only returned the first 50.
To get all results for this search, we can either increase the number of returned results:
ulex_all <- search_wcvp("Ulex", limit=100)
ulex_all
#> <WCVP search: 'Ulex' filters: 'none'>
#> total results: 93
#> returned results: 93
#> total pages: 1
#> current page: 1
#> List of 1
#> $ :List of 9
#> ..$ id : chr "23746-1"
#> ..$ fqId : chr "urn:lsid:ipni.org:names:23746-1"
#> ..$ url : chr "/taxon/23746-1"
#> ..$ display : chr "<b><i>Ulex</i> L.</b>"
#> ..$ accepted: logi TRUE
#> ..$ family : chr "Fabaceae"
#> ..$ name : chr "Ulex"
#> ..$ author : chr "L."
#> ..$ rank : chr "Genus"
Or advance the searh on one page:
ulex_page1 <- search_wcvp("Ulex")
ulex_page2 <- request_next(ulex_page1)
ulex_page2
#> <WCVP search: 'Ulex' filters: 'none'>
#> total results: 93
#> returned results: 43
#> total pages: 2
#> current page: 2
#> List of 1
#> $ :List of 10
#> ..$ id : chr "524312-1"
#> ..$ fqId : chr "urn:lsid:ipni.org:names:524312-1"
#> ..$ url : chr "/taxon/524312-1"
#> ..$ display : chr "<i>Ulex ianthocladus</i> Webb"
#> ..$ accepted : logi FALSE
#> ..$ synonymOf:List of 8
#> ..$ family : chr "Fabaceae"
#> ..$ name : chr "Ulex ianthocladus"
#> ..$ author : chr "Webb"
#> ..$ rank : chr "Species"
In both cases, we can tidy the results into a tibble to make subsequent analysis easier:
tidy(ulex_all)
#> # A tibble: 93 × 10
#> id fqId url display accepted family name author rank synonymOf
#> <chr> <chr> <chr> <chr> <lgl> <chr> <chr> <chr> <chr> <list>
#> 1 23746-1 urn:l… /taxo… <b><i>… TRUE Fabac… Ulex L. Genus <NULL>
#> 2 524268-1 urn:l… /taxo… <i>Ule… FALSE Fabac… Ulex… Webb Spec… <tibble …
#> 3 993445-1 urn:l… /taxo… <i>Ule… FALSE Fabac… Ulex… Esp.S… Spec… <tibble …
#> 4 524269-1 urn:l… /taxo… <i>Ule… FALSE Fabac… Ulex… Link … Spec… <tibble …
#> 5 524270-1 urn:l… /taxo… <b><i>… TRUE Fabac… Ulex… Welw.… Spec… <NULL>
#> 6 77196491-1 urn:l… /taxo… <b><i>… TRUE Fabac… Ulex… NA Subs… <NULL>
#> 7 524271-1 urn:l… /taxo… <i>Ule… FALSE Fabac… Ulex… Mabil… Spec… <tibble …
#> 8 524273-1 urn:l… /taxo… <b><i>… TRUE Fabac… Ulex… Cleme… Spec… <NULL>
#> 9 77208445-1 urn:l… /taxo… <b><i>… TRUE Fabac… Ulex… NA Subs… <NULL>
#> 10 993446-1 urn:l… /taxo… <b><i>… TRUE Fabac… Ulex… (Plan… Subs… <NULL>
#> # … with 83 more rows
bind_rows(
tidy(ulex_page1),
tidy(ulex_page2)
)
#> # A tibble: 93 × 10
#> id fqId url display accepted family name author rank synonymOf
#> <chr> <chr> <chr> <chr> <lgl> <chr> <chr> <chr> <chr> <list>
#> 1 23746-1 urn:l… /taxo… <b><i>… TRUE Fabac… Ulex L. Genus <NULL>
#> 2 524268-1 urn:l… /taxo… <i>Ule… FALSE Fabac… Ulex… Webb Spec… <tibble …
#> 3 993445-1 urn:l… /taxo… <i>Ule… FALSE Fabac… Ulex… Esp.S… Spec… <tibble …
#> 4 524269-1 urn:l… /taxo… <i>Ule… FALSE Fabac… Ulex… Link … Spec… <tibble …
#> 5 524270-1 urn:l… /taxo… <b><i>… TRUE Fabac… Ulex… Welw.… Spec… <NULL>
#> 6 77196491-1 urn:l… /taxo… <b><i>… TRUE Fabac… Ulex… NA Subs… <NULL>
#> 7 524271-1 urn:l… /taxo… <i>Ule… FALSE Fabac… Ulex… Mabil… Spec… <tibble …
#> 8 524273-1 urn:l… /taxo… <b><i>… TRUE Fabac… Ulex… Cleme… Spec… <NULL>
#> 9 77208445-1 urn:l… /taxo… <b><i>… TRUE Fabac… Ulex… NA Subs… <NULL>
#> 10 993446-1 urn:l… /taxo… <b><i>… TRUE Fabac… Ulex… (Plan… Subs… <NULL>
#> # … with 83 more rows
The search function also accepts a number of keywords and filters that can be used to narrow down the results returned. A full list of keywords and filters can be found in the function documentation.
An example use of these filters is retrieving a checklist of accepted species in a genus. In the search below, the genus
keyword to retrieve all records in the genus Myrcia, while the filters accepted
and species
narrow these records down to just accepted species:
checklist <- search_wcvp(list(genus="Myrcia"),
filters=c("accepted", "species"),
limit=1000)
checklist
#> <WCVP search: genus='Myrcia' filters: 'accepted, species'>
#> total results: 767
#> returned results: 767
#> total pages: 1
#> current page: 1
#> List of 1
#> $ :List of 9
#> ..$ id : chr "165525-2"
#> ..$ fqId : chr "urn:lsid:ipni.org:names:165525-2"
#> ..$ url : chr "/taxon/165525-2"
#> ..$ display : chr "<b><i>Myrcia abbotiana</i> (Urb.) Alain</b>"
#> ..$ accepted: logi TRUE
#> ..$ family : chr "Myrtaceae"
#> ..$ name : chr "Myrcia abbotiana"
#> ..$ author : chr "(Urb.) Alain"
#> ..$ rank : chr "Species"
As well as searching by name, the WCVP API can be used to look up taxonomic information for a known IPNI ID. The returned information can then be used to find all synonyms for a name, find the accepted name for a taxon, or find the parent/child taxa.
The IPNI ID can be found a few different ways, for example using the KNMS
API to match a name to an IPNI ID. In this case we will find it using WCVP.
search_result <- search_wcvp("Calyptranthes acevedoi",
filters=c("species"))
ipni_id <- search_result$results[[1]]$id
ipni_id
#> [1] "273933-2"
With this, we can look the record up.
taxon_info <- lookup_wcvp(ipni_id)
taxon_info
#> <WCVP taxon id: 273933-2>
#> Name: Calyptranthes acevedoi
#> Authors: Alain
#> Status: homotypic synonym
#> Rank: Species
#> Accepted taxon ID: 77191340-1
#> Synonyms: 0
From this record, we can see that the name we had is a Homotypic Synonym. This record also contains the taxonomic information for the current accepted name:
tidied <- tidy(taxon_info)
tidied$accepted[[1]]
#> # A tibble: 1 × 9
#> id fqId url display accepted family name author rank
#> <chr> <chr> <chr> <chr> <lgl> <chr> <chr> <chr> <chr>
#> 1 77191340-1 urn:lsi… /taxon… <b><i>Myrcia… TRUE Myrta… Myrc… (Alain)… Spec…
There are cases where it might be easier to download all of the WCVP, rather than make lots of requests to it. The download_wcvp
function lets you download the whole WCVP to whatever directory you want.
save_path <- here()
download_wcvp(save_path)
Previous versions of the WCVP are also available, for posterity and reproducibility. These can be downloaded by specifying which version you want.
download_wcvp(save_path, version=1)