This function check which species (both plants and animals) are considered "invaders" somewhere in the world.
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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment