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 WCVP for a taxon name

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

Getting a list of accepted names in a genus

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"

Looking up accepted names

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…

Downloading the whole WCVP

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)