Created
November 23, 2012 15:11
-
-
Save ibartomeus/4136068 to your computer and use it in GitHub Desktop.
This function check which species (both plants and animals) are considered "invaders" somewhere in the world.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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