November 26, 2012 From rOpenSci (https://deploy-preview-172--ropensci.netlify.app/blog/2012/11/26/is-invasive/). Except where otherwise noted, content on this site is licensed under the CC-BY license.
The following was a guest post from Ignasi Bartomeus, originally posted on his blog on 26 Nov, 2012. Check out a related blog post here. Note the functionality discussed in this post is now in our taxize package under the function gisd_isinvasive
. We hacked out a quick Shiny app so you can play around with the below function in taxize on the web to get invasive status and plot it on a phylogeny. Check it out here.
Celebrating that I am contributing to the R-bloggers.com blog aggregator I am going to post a very simple function to check which species (both plants and animals) are considered “invaders” somewhere in the world. Basically the function asks that to the Global Invasive Species Database (GISD).
I coded this because a friend of mine aks me precisely that question [Yes, friends assumes you should know this kind of stuff (and also why the plants of their balcony are dying) off the top of your head just because you are a biologist]. However, I do not know much things and I am too lazy to check all 250 species one by one on the GISD webpage. Also is a good R practice, and I am ok investing some work time on personal projects. Google (and other big companies) encourage it’s employees to spend 20% of the time working on projects that aren’t necessarily in their job descriptions in order to bust its innovation power, so that should be even more important in science!
Hope it can be useful to more people, I uploaded the code as a Gist:
is.invasive() | |
##Description## | |
#This function check which species (both plants and animals) are considered "invaders" somewhere in the | |
# world. For that end, it checks GISD (http://www.issg.org/database/welcome/) and returns a value, either | |
#"Not invasive" or the brief description presented in GISD. Note that the webpage contains more | |
#information. Also note that the function won't tell you if it's exotic in your area, a lot of exotic | |
#species are not considered invaders (yet). As expected, the function is as good as the database is, which | |
#I find quite reliable and well maintained. The database is also able to recognize a lot (but not all) of | |
#the species synonyms. This function worked for me, but I didn't test it intensively, and any changes on | |
#the webpage html design will return wrong values. Apply the usual disclaimers when using it. | |
#The function is slow (not optimized at all), so be patient with long lists of species. | |
#Author Ignasi Bartomeus (nacho.bartomeus#gmail.com). Last updated 23 Nov 2012. | |
#Usage: | |
is.invasive(sp, simplified.df = FALSE) | |
#Arguments: | |
#sp: a vector of species names in latin (Genus species) | |
#simplified.df: Returns a data.frame with the species name and the values "Invasive", "Not Invasive". I | |
#recomend to check first the not simplified version (default), which contains raw information about the | |
#level of invasiveness. | |
#The function: | |
is.invasive <- function(sp, simplified.df = FALSE){ | |
require(plyr) | |
require(XML) | |
require(RCurl) | |
#reformat sp list | |
species <- gsub(" ","+",sp) | |
#create urls to parse | |
urls <- paste("http://www.issg.org/database/species/search.asp?sts=sss&st=sss&fr=1&x=13&y=9&sn=", | |
species,"&rn=&hci=-1&ei=-1&lang=EN", sep = "") | |
#create a data.frame to store the Output | |
Out <- data.frame(species = sp, status = c(1:length(urls))) | |
#loop through all species | |
for(i in 1:length(urls)){ | |
#Parse url and extract table | |
doc <- htmlTreeParse(urls[i], useInternalNodes = TRUE) | |
tables <- getNodeSet(doc, "//table") | |
t <- readHTMLTable(tables[[4]]) | |
tt <- as.matrix(t) | |
if(length(grep("No invasive species currently recorded",tt, value = TRUE)) > 0){ | |
Out[i,2] <- "Not invasive" | |
} | |
else{ | |
if(simplified.df == FALSE){Out[i,2] <- tt[12,1]} | |
else{Out[i,2] <- "Invasive"} | |
} | |
print(paste("Checking species", i+1)) | |
} | |
print("Done") | |
Out | |
} | |
#Example: | |
sp <- c("Carpobrotus edulis", "Rosmarinus officinalis") | |
## first species is invasive, second one is not. | |
d <- is.invasive(sp) | |
d | |
d <- is.invasive(sp, simplified.df = TRUE) | |
d |
UPDATE: The function is now available on taxize R package developed by the rOpenSci people!