R/altadata.R

Defines functions altadata.query_builder altadata.request altadata.check_parameters altadata.condition_not_in altadata.condition_in altadata.less_than_equal altadata.less_than altadata.greater_than_equal altadata.greater_than altadata.not_equal altadata.equal altadata.sort altadata.select altadata.get_header altadata.list_subscription altadata.load altadata.get_data

Documented in altadata.condition_in altadata.condition_not_in altadata.equal altadata.get_data altadata.get_header altadata.greater_than altadata.greater_than_equal altadata.less_than altadata.less_than_equal altadata.list_subscription altadata.load altadata.not_equal altadata.select altadata.sort

#' Initialize retrieve data process
#'
#' @param product_code data product code
#' @param limit number of rows you want to retrieve
#'
#' @return Nothing just set the initial parameters
#' @export
#'
#' @examples
#' \dontrun{
#'   altadata.get_data("co_10_jhucs_03", limit = 50)
#' }
altadata.get_data <- function(product_code, limit) {
  altadata.check_parameters(product_code, "product_code", parameter_type = "character")

  data_api_url <- paste(
    getOption("aldatata.data_api_base_url"),
    product_code,
    "/?format=json",
    "&api_key=",
    getOption("aldatata.api_key"),
    sep =""
  )
  options(aldatata.data_api_url = data_api_url)
  options(aldatata.condition_text = "")

  if(missing(limit)){
    options(aldatata.data_limit = NULL)
  } else {
    altadata.check_parameters(limit, "limit", parameter_type = "numeric")
    options(aldatata.data_limit = limit)
  }
}

#' Fetch data with configurations given before
#'
#' @return dataframe object
#' @export
#'
#' @examples
#' \dontrun{
#'   aldatata.api_key('YOUR_API_KEY')
#'   altadata.get_data("co_10_jhucs_03", limit = 50)
#'   altadata.load()
#' }
altadata.load <- function() {
  data <- c()
  page <- 1
  total_size <- 0
  response_length <- 1
  data_limit <- getOption("aldatata.data_limit")

  while (response_length > 0) {
    request_url <- altadata.query_builder(page)

    tryCatch({
      df <- altadata.request(request_url)
    }, error = function(e){
      print(e)
    })

    data = rbind(data, df)

    response_length <- length(df)
    total_size <- length(data)

    if(!is.null(data_limit)){
      if(total_size > data_limit){
        break
      }
    }

    page <- page + 1
  }

  if(!is.null(data_limit)){
    data <- utils::head(data, data_limit)
  }

  return(data)
}


#' Get customer subscription info
#'
#' @return dataframe object
#' @export
#'
#' @examples
#' \dontrun{
#'   altadata.list_subscription()
#' }
altadata.list_subscription <- function() {
  subscription_api_url <- getOption("aldatata.subscription_api_url")
  subscription_info <- altadata.request(subscription_api_url)

  return(subscription_info)
}


#' Get data header as a vector
#'
#' @param product_code data product code
#'
#' @return vector object
#' @export
#'
#' @examples
#' \dontrun{
#'   aldatata.api_key('YOUR_API_KEY')
#'   altadata.get_header("co_10_jhucs_03")
#' }
altadata.get_header <- function(product_code) {
  altadata.check_parameters(product_code, "product_code", parameter_type = "character")

  request_url <- paste(
    getOption("aldatata.data_api_base_url"),
    product_code,
    "/?format=json",
    "&api_key=",
    getOption("aldatata.api_key"),
    "&page=1",
    sep =""
  )
  json_response <- altadata.request(request_url)
  header_info <- names(json_response)

  return(header_info)
}


#' Select specific columns in the retrieve data process
#'
#' @param selected_columns list of columns to select
#'
#' @return Nothing just set the select parameters
#' @export
#'
#' @examples
#' \dontrun{
#'   altadata.select(c("reported_date", "province_state", "mortality_rate"))
#' }
altadata.select <- function(selected_columns) {
  altadata.check_parameters(selected_columns, "selected_columns", parameter_type = "vector")
  selected_columns_text <- paste(selected_columns, collapse=",")

  condition_text <- paste(
    getOption("aldatata.condition_text"),
    "&columns=",
    selected_columns_text,
    sep = ""
  )

  options(aldatata.condition_text = condition_text)
}

#' Sort data by given column and method in the retrieve data process
#'
#' @param order_column column to which the order is applied
#' @param order_method sorting method. Posibble values: asc or desc
#'
#' @return Nothing just set the sort parameters
#' @export
#'
#' @examples
#' \dontrun{
#'   altadata.sort("province_state", order_method = "desc")
#' }
altadata.sort <- function(order_column, order_method = "asc") {
  altadata.check_parameters(order_column, "order_column", parameter_type = "character")
  altadata.check_parameters(order_method, "order_method", parameter_type = "character")

  if(!(order_method %in% c("asc", "desc"))){
    stop("order_method parameter must be 'asc' or 'desc'")
  }

  condition_text <- paste(
    getOption("aldatata.condition_text"),
    "&order_by=",
    order_column,
    "_",
    toString(order_method),
    sep = ""
  )

  options(aldatata.condition_text = condition_text)
}

#' Equal condition by given column and value in the retrieve data process
#'
#' @param condition_column column to which the condition will be applied
#' @param condition_value value to use with condition
#'
#' @return Nothing just set the equal condition parameters
#' @export
#'
#' @examples
#' \dontrun{
#'   altadata.equal("province_state", "Alabama")
#' }
altadata.equal <- function(condition_column, condition_value) {
  altadata.check_parameters(condition_column, "condition_column", parameter_type = "character")

  condition_text <- paste(
    getOption("aldatata.condition_text"),
    "&",
    condition_column,
    "_eq=",
    toString(condition_value),
    sep = ""
  )

  options(aldatata.condition_text = condition_text)
}

#' Not equal condition by given column and value
#'
#' @param condition_column column to which the condition will be applied
#' @param condition_value value to use with condition
#'
#' @return Nothing just set the not equal condition parameters
#' @export
#'
#' @examples
#' \dontrun{
#'   altadata.not_equal("province_state", "Utah")
#' }
altadata.not_equal <- function(condition_column, condition_value) {
  altadata.check_parameters(condition_column, "condition_column", parameter_type = "character")

  condition_text <- paste(
    getOption("aldatata.condition_text"),
    "&",
    condition_column,
    "_neq=",
    toString(condition_value),
    sep = ""
  )

  options(aldatata.condition_text = condition_text)
}

#' Greater than condition by given column and value
#'
#' @param condition_column column to which the condition will be applied
#' @param condition_value value to use with condition
#'
#' @return Nothing just set the greater than condition parameters
#' @export
#'
#' @examples
#' \dontrun{
#'   altadata.greater_than("mortality_rate", 2)
#' }
altadata.greater_than <- function(condition_column, condition_value) {
  altadata.check_parameters(condition_column, "condition_column", parameter_type = "character")

  condition_text <- paste(
    getOption("aldatata.condition_text"),
    "&",
    condition_column,
    "_gt=",
    toString(condition_value),
    sep = ""
  )

  options(aldatata.condition_text = condition_text)
}

#' Greater than equal condition by given column and value
#'
#' @param condition_column column to which the condition will be applied
#' @param condition_value value to use with condition
#'
#' @return Nothing just set the greater than equal condition parameters
#' @export
#'
#' @examples
#' \dontrun{
#'   altadata.greater_than_equal("mortality_rate", 3)
#' }
altadata.greater_than_equal <- function(condition_column, condition_value) {
  altadata.check_parameters(condition_column, "condition_column", parameter_type = "character")

  condition_text <- paste(
    getOption("aldatata.condition_text"),
    "&",
    condition_column,
    "_gte=",
    toString(condition_value),
    sep = ""
  )

  options(aldatata.condition_text = condition_text)
}

#' Less than condition by given column and value
#'
#' @param condition_column column to which the condition will be applied
#' @param condition_value value to use with condition
#'
#' @return Nothing just set the less than condition parameters
#' @export
#'
#' @examples
#' \dontrun{
#'   altadata.less_than("mortality_rate", 2)
#' }
altadata.less_than <- function(condition_column, condition_value) {
  altadata.check_parameters(condition_column, "condition_column", parameter_type = "character")

  condition_text <- paste(
    getOption("aldatata.condition_text"),
    "&",
    condition_column,
    "_lt=",
    toString(condition_value),
    sep = ""
  )

  options(aldatata.condition_text = condition_text)
}

#' Less than equal condition by given column and value
#'
#' @param condition_column column to which the condition will be applied
#' @param condition_value value to use with condition
#'
#' @return Nothing just set the less than equal condition parameters
#' @export
#'
#' @examples
#' \dontrun{
#'   altadata.less_than_equal("mortality_rate", 3)
#' }
altadata.less_than_equal <- function(condition_column, condition_value) {
  altadata.check_parameters(condition_column, "condition_column", parameter_type = "character")

  condition_text <- paste(
    getOption("aldatata.condition_text"),
    "&",
    condition_column,
    "_lte=",
    toString(condition_value),
    sep = ""
  )

  options(aldatata.condition_text = condition_text)
}

#' In condition by given column and value list
#'
#' @param condition_column column to which the condition will be applied
#' @param condition_value value to use with condition
#'
#' @return Nothing just set the in condition parameters
#' @export
#'
#' @examples
#' \dontrun{
#'   altadata.condition_in("province_state", c("Utah", "Alabama"))
#' }
altadata.condition_in <- function(condition_column, condition_value) {
  altadata.check_parameters(condition_column, "condition_column", parameter_type = "character")
  altadata.check_parameters(condition_value, "condition_value", parameter_type = "vector")

  condition_value_text <- paste(condition_value, collapse=",")

  condition_text <- paste(
    getOption("aldatata.condition_text"),
    "&",
    condition_column,
    "_in=",
    condition_value_text,
    sep = ""
  )

  options(aldatata.condition_text = condition_text)
}

#' Not in condition by given column and value list
#'
#' @param condition_column column to which the condition will be applied
#' @param condition_value value to use with condition
#'
#' @return Nothing just set the not in condition parameters
#' @export
#'
#' @examples
#' \dontrun{
#'   altadata.condition_not_in("province_state", c("Utah", "Alabama"))
#' }
altadata.condition_not_in <- function(condition_column, condition_value) {
  altadata.check_parameters(condition_column, "condition_column", parameter_type = "character")
  altadata.check_parameters(condition_value, "condition_value", parameter_type = "vector")

  condition_value_text <- paste(condition_value, collapse=",")

  condition_text <- paste(
    getOption("aldatata.condition_text"),
    "&",
    condition_column,
    "_notin=",
    condition_value_text,
    sep = ""
  )

  options(aldatata.condition_text = condition_text)
}

## Helper functions

# Check parameter types by given inputs
altadata.check_parameters <- function(paramater, paramater_name, parameter_type) {
  if (parameter_type == "vector") {
    if (class(paramater) != "character") {
      stop(paste(paramater_name, " parameter must be ", parameter_type, sep=""))
    }
    else if (length(paramater) < 1) {
      stop(paste(paramater_name, " parameter must contain at least one value", sep=""))
    }
  }
  else if (parameter_type == "character") {
    if (class(paramater) != "character") {
      stop(paste(paramater_name, " parameter must be ", parameter_type, sep=""))
    }
  } else if (parameter_type == "numeric") {
    if (class(paramater) != "numeric") {
      stop(paste(paramater_name, " parameter must be ", parameter_type, sep=""))
    }
  }
}


# Request API and parse the result
altadata.request <- function(request_url) {
  response <- httr::GET(request_url)

  if(httr::status_code(response) != 200){
    stop(httr::content(response, as = "text"), call. = FALSE)
  }

  json_response <- jsonlite::fromJSON(rawToChar(response$content))

  return(json_response)
}


# Create API request url
altadata.query_builder <- function(page) {
  condition_text <- getOption("aldatata.condition_text")

  if(condition_text == ""){
    request_url <- paste(
      getOption("aldatata.data_api_url"),
      "&page=",
      toString(page),
      sep =""
    )
  }
  else {
    request_url <- paste(
      getOption("aldatata.data_api_url"),
      condition_text,
      "&page=",
      toString(page),
      sep =""
    )
  }

  return(request_url)
}

Try the altadata package in your browser

Any scripts or data that you put into this service are public.

altadata documentation built on Dec. 7, 2020, 9:07 a.m.