Raw File
organizations.r
#' Organizations metadata.
#'
#' @export
#'
#' @template otherlimstart
#' @template occ
#' @param data The type of data to get. Default is all data.
#' @param uuid UUID of the data node provider. This must be specified if data
#'    is anything other than 'all'.
#' @param query Query nodes. Only used when data='all'
#'
#' @return A list of length one or two. If \code{uuid} is NULL, then a data.frame with
#' call metadata, and a data.frame, but if \code{uuid} given, then a list.
#'
#' @references \url{http://www.gbif.org/developer/registry#organizations}
#'
#' @examples \dontrun{
#' organizations(limit=5)
#' organizations(query="france")
#' organizations(uuid="4b4b2111-ee51-45f5-bf5e-f535f4a1c9dc")
#' organizations(data='contact', uuid="4b4b2111-ee51-45f5-bf5e-f535f4a1c9dc")
#' organizations(data='pending')
#' organizations(data=c('contact','endpoint'), uuid="4b4b2111-ee51-45f5-bf5e-f535f4a1c9dc")
#'
#' # Pass on options to httr
#' library('httr')
#' # res <- organizations(query="spain", config=progress())
#' }

organizations <- function(data = 'all', uuid = NULL, query = NULL, limit=100, start=NULL, ...)
{
  args <- rgbif_compact(list(q = query, limit=as.integer(limit), offset=start))

  data <- match.arg(data, choices=c('all', 'organization', 'contact', 'endpoint',
                                    'identifier', 'tag', 'machineTag', 'comment',
                                    'hostedDataset', 'ownedDataset', 'deleted',
                                    'pending', 'nonPublishing'), several.ok = TRUE)

  # Define function to get data
  getdata <- function(x){
    if(!data %in% c('all','deleted', 'pending', 'nonPublishing') && is.null(uuid))
      stop('You must specify a uuid if data does not equal "all" and
       data does not equal of deleted, pending, or nonPublishing')

    if(is.null(uuid)){
      if(x=='all'){
        url <- paste0(gbif_base(), '/organization')
      } else
      {
        url <- sprintf('%s/organization/%s', gbif_base(), x)
      }
    } else
    {
      if(x=='all'){
        url <- sprintf('%s/organization/%s', gbif_base(), uuid)
      } else
      {
        url <- sprintf('%s/organization/%s/%s', gbif_base(), uuid, x)
      }
    }
    res <- gbif_GET(url, args, TRUE, ...)
    structure(list(meta=get_meta(res), data=parse_results(res, uuid)))
  }

  # Get data
  if(length(data)==1) getdata(data) else lapply(data, getdata)
}

get_meta <- function(x){
  if('endOfRecords' %in% names(x))
    data.frame(x[!names(x) == 'results'], stringsAsFactors = FALSE)
  else
    NULL
}

list0tochar <- function(x){
  if(class(x) == 'list'){
    tmp <- vapply(x, length, numeric(1))
    if(sum(tmp) == 0) NA else x
  } else { x }
}

parse_results <- function(x, y){
  if(!is.null(y)){
    if('endOfRecords' %in% names(x))
      x[ !names(x) %in% c('offset','limit','endOfRecords','count') ]
    else
      x
  } else {
#     dat <- x$results
#     for(i in seq_along(dat)){
#       if(is(dat[[i]], 'list')){
#         tmp <- vapply(dat[[i]], length, numeric(1))
#         dat[[i]] <-
#           if(sum(tmp) == 0) {
#             NA
#           } else if(max(tmp) == 1){
#             dat[[i]][sapply(dat[[i]], function(x) is.null(x) || length(x)==0 )] <- NA
#             unlist(dat[[i]])
#           } else { dat[[i]] }
#       } else { dat[[i]] <- dat[[i]] }
#     }
    x$results
  }
}

#       else if(is(dat[[i]], "data.frame")){
#         dattmp <- dat[[i]]
#         names(dattmp) <- paste(names(dat[i]), names(dat[[i]]), sep = ".")
#         dat[[i]] <- NULL
#         cbind(dat, dattmp) %>% glimpse
#       }
back to top