knitr::opts_chunk$set( collapse = TRUE, comment = "#>" )
eppoFindeR provides an R interface to the public APIs of the European and Mediterranean Plant Protection Organization (EPPO) database. The package facilitates access to a wide range of pest-related information collected and maintained by EPPO, allowing users to query, retrieve, and process this data directly from R.
The package is intended for researchers, analysts, and practitioners in plant protection who require convenient programmatic access to EPPO data.
install.packages("eppoFindeR")
To install the latest development version:
# install.packages("devtools") devtools::install_github("openefsa/eppoFindeR")
An active internet connection is required, as the package communicates with EPPO’s online services to fetch and process data.
The eppoFindeR package requires your unique API token to function properly. You can provide this token in one of two ways:
.Renviron file.\.RenvironThe .Renviron file is used to define environment variables that R loads automatically at the start of each session. This approach is particularly convenient for sensitive information like API keys, as it allows you to use them in any R script or function without hardcoding them.
Place the .Renviron file in your home directory (for example, C:/Users/username/Documents/.Renviron on Windows or ~/.Renviron on Unix-like systems). You can create or edit this file with any plain text editor.
Add your EPPO API key in the following format:
EPPO_API_KEY=<your_eppo_api_key>
After saving the file, R will automatically read the token on startup.
Alternatively, you can provide the API key directly in the apiKey argument of functions that require it. This is useful if you want to use different tokens for different calls, or if you prefer not to store the token globally. For example:
taxon(c("BEMITA"), apiKey = "<your_eppo_api_key>")
The main purpose of eppoFindeR is to query the EPPO database for specific EPPO codes and retrieve relevant information across various endpoints. For each endpoint, you can either:
For plant and pest species, the basic information returned includes scientific names, synonyms, common names in different languages, and taxonomic classification. For pests of regulatory interest, you can also retrieve more detailed information, such as host plants and quarantine categorization.
Below are examples demonstrating how to use the functions in this package. First, load the eppoFindeR package:
library(eppoFindeR)
To explore the arguments and usage of a specific function, you can run:
help("<function_name>")
This will show the full documentation for the function, including its arguments, return values, and usage examples.
For example, if you are working with the taxon() function, you can check its documentation with:
help("taxon")
The eppoFindeR package allows you to query all categories available in version 2.0 of the EPPO APIs: General, Taxons, Taxon, Country, RPPO, Tools, Reporting Service, and References.
Each category has a corresponding function in the package with the same name in lowerCamelCase format: general(), taxons(), taxon(), country(), rppo(), tools(), reportingService(), and references(). By default, these functions return all data available under the selected category, but you can customize the query by specifying the desired services.
For example, to query all services of the Taxon category for the EPPO code "BEMITA", you can use the following code:
taxon(c("BEMITA"))
Some services require certain mandatory parameters, which must be provided when making the request. For example:
tools( c("name2codes"), # The service to query (/tools/name2codes). params = list( name2codes = list( name = "Bemisia tabaci" # The required parameter. ) ) )
To query a specific service within an endpoint, eppoFindeR allows you to specify it directly in the function call. For example, to access only the /taxons/taxon/categorization service for the EPPO code "BEMITA", you can use the taxon() function as follows:
taxon(c("BEMITA"), c("categorization"))
$categorization # A tibble: 20 × 12 queried_eppo_code continent_id continent_name country_iso country_name qlist qlist_label year_add <chr> <int> <chr> <chr> <chr> <chr> <chr> <int> 1 BEMITA 4 America CL Chile 1 A1 list 2019 2 BEMITA 2 Asia BH Bahrain 2 A2 list 2003 3 BEMITA 2 Asia KZ Kazakhstan 1 A1 list 2017 4 BEMITA 1 Europe AZ Azerbaijan 1 A1 list 2024 5 BEMITA 1 Europe BY Belarus X Quarantine… 1994 6 BEMITA 1 Europe GE Georgia 1 A1 list 2018 7 BEMITA 1 Europe MD Moldova, Repub… X Quarantine… 2017 8 BEMITA 1 Europe NO Norway X Quarantine… 2012 9 BEMITA 1 Europe RU Russian Federa… 2 A2 list 2014 10 BEMITA 1 Europe RS Serbia 1 A1 list 2015 11 BEMITA 1 Europe CH Switzerland 1 A1 list 2019 12 BEMITA 1 Europe TR Türkiye 2 A2 list 2016 13 BEMITA 1 Europe UA Ukraine 1 A1 list 2019 14 BEMITA 1 Europe GB United Kingdom 1 A1 list 2020 15 BEMITA 5 Oceania NZ New Zealand X Quarantine… 2000 16 BEMITA 6 RPPO/EU 9M EAEU 2 A2 list 2016 17 BEMITA 6 RPPO/EU 9A EPPO 2 A2 list 1989 18 BEMITA 6 RPPO/EU 9L EU P PZ Quarant… 2019 19 BEMITA 6 RPPO/EU 9L EU N A1 Quarant… 2019 20 BEMITA 6 RPPO/EU 9H OIRSA 2 A2 list 1992 # ℹ 4 more variables: year_delete <lgl>, year_transient <lgl>, queried_url <chr>, queried_on <dttm>
All function calls return a list of dataframes, each containing the information from the requested services.
To fetch data from all available services within a specific endpoint, simply use the corresponding function without modifying the services parameter. Each function will return a list of dataframes, with each dataframe containing information from one service.
data <- taxon(c("BEMITA"))
# Print the names of the services in the result. names(data) [1] "overview" "infos" "names" "taxonomy" [5] "categorization" "kingdom" "hosts" "pests" [9] "vectors" "vectorof" "bca" "bcaof" [13] "photos" "reporting_articles" "documents" "standards" [17] "distribution" # Print the data from a specific service. data$overview # A tibble: 1 × 11 queried_eppo_code eppocode datecreate lastupdate infos replacedby prefname is_active datatype <chr> <chr> <chr> <chr> <lgl> <lgl> <chr> <lgl> <chr> 1 BEMITA BEMITA 2002-10-28 00:00:… 2002-10-2… NA NA Bemisia… TRUE GAI # ℹ 2 more variables: queried_url <chr>, queried_on <dttm>
Using names(data) will display the names of the queried services. You can then access a specific service to view the data associated with it.
The eppoFindeR package provides a convenient function, uniformTaxonomy(), to create a complete and standardized taxonomy dataframe. This function takes the taxonomy data returned by the taxonomy service and ensures a uniform structure, including all expected taxonomic ranks, even if some ranks are missing in the original result.
For example, assume you have retrieved taxonomy data for the EPPO code "BEMITA" using the taxon() function:
data <- taxon(c("BEMITA"), c("taxonomy"))
You can then generate a uniform taxonomy table with all ranks using:
taxonomy <- uniformTaxonomy(data$taxonomy)
# A tibble: 11 × 6 type queried_eppo_code eppocode prefname queried_url queried_on <chr> <chr> <chr> <chr> <chr> <dttm> 1 Kingdom BEMITA 1ANIMK Animalia https://api.eppo.int/gd/v2/… 2025-11-18 14:29:50 2 Phylum BEMITA 1ARTHP Arthropoda https://api.eppo.int/gd/v2/… 2025-11-18 14:29:50 3 Subphylum BEMITA 1HEXAQ Hexapoda https://api.eppo.int/gd/v2/… 2025-11-18 14:29:50 4 Class BEMITA 1INSEC Insecta https://api.eppo.int/gd/v2/… 2025-11-18 14:29:50 5 Subclass NA NA NA NA NA 6 Order BEMITA 1HEMIO Hemiptera https://api.eppo.int/gd/v2/… 2025-11-18 14:29:50 7 Suborder BEMITA 1STERR Sternorrhyncha https://api.eppo.int/gd/v2/… 2025-11-18 14:29:50 8 Family BEMITA 1ALEYF Aleyrodidae https://api.eppo.int/gd/v2/… 2025-11-18 14:29:50 9 Subfamily NA NA NA NA NA 10 Genus BEMITA 1BEMIG Bemisia https://api.eppo.int/gd/v2/… 2025-11-18 14:29:50 11 Species BEMITA BEMITA Bemisia tabaci https://api.eppo.int/gd/v2/… 2025-11-18 14:29:50
The taxon() and country() functions allow you to retrieve also a complete data dump for multiple EPPO or ISO codes by querying all available EPPO services for each of them.
Here is an example showing how to use the function to fetch all available information for the EPPO codes "BEMITA" and "GOSHI":
data <- taxon(c("BEMITA", "GOSHI"))
# Print the names of the services in the result. names(data) [1] "overview" "infos" "names" "taxonomy" [5] "categorization" "kingdom" "hosts" "pests" [9] "vectors" "vectorof" "bca" "bcaof" [13] "photos" "reporting_articles" "documents" "standards" [17] "distribution" # Print the data from a specific service. data$overview # A tibble: 2 × 11 queried_eppo_code eppocode datecreate lastupdate infos replacedby prefname is_active datatype <chr> <chr> <chr> <chr> <chr> <lgl> <chr> <lgl> <chr> 1 BEMITA BEMITA 2002-10-28 00:00:… 2002-10-2… NA NA Bemisia… TRUE GAI 2 GOSHI GOSHI 2004-04-21 00:00:… 2004-04-2… <p>M… NA Gossypi… TRUE PFL # ℹ 2 more variables: queried_url <chr>, queried_on <dttm>
Using names(data) will display the names of the queried services. You can then access a specific service to view the data associated with it.
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.