R/datatable.R

Defines functions googleDataType.default googleDataType.AsIs googleDataType.POSIXct googleDataType.Date googleDataType.factor googleDataType.logical googleDataType.character googleDataType.integer googleDataType.numeric googleDataType inferColumns column googleDataTable

#' @export
googleDataTable <- function(data, columns = NULL) {
  cols <- NULL
  if (is.null(columns)) {
    cols <- inferColumns(data)
  } else {
    cols <- columns
  }
  
  if (!is.null(names(cols))) {
    if (any(names(cols) == '')) {
      stop('Some but not all column definitions were named. Please ',
           'pass either all named, or all unnamed definitions.')
    }
    
    if (!isTRUE(all.equal(sort(names(cols)), sort(names(data))))) {
      stop('Column definition names did not match data variables')
    }
    
    # Order the cols according to the data
    cols <- cols[match(names(cols), names(data))]
  } else {
    if (length(cols) != length(data)) {
      stop('Incorrect number of columns were passed to googleDataTable',
           '; the number of columns must match the number of variables',
           ' in the data')
    }
    names(cols) <- names(data)
  }
  
  # TODO: Validate no duplicate variable names
  # TODO: Validate no JS-illegal column names
  
  colDefs <- lapply(names(cols), function(colName) {
    def <- cols[[colName]]
    if (is.null(def$id))
      def$id <- colName
    if (is.null(def$label))
      def$label <- def$id
    return(def)
  })
  
  return(list(
    cols = colDefs,
    data = lapply(as.list(data), function(x) {
      I(x)
    })
  ))
}

#' @export
column <- function(
  type = c('boolean', 'number', 'string', 'date', 'datetime', 'timeofday'),
  label = NULL,
  p = NULL) {
  
  col <- list(type = type)
  if (!is.null(label))
    col$label <- label
  if (!is.null(p))
    col$p <- p
  
  return(col)
}

inferColumns <- function(df) {
  lapply(df, function(x) {
    column(type = googleDataType(x))
  })
}

googleDataType <- function(x) {
  UseMethod("googleDataType")
}

googleDataType.numeric <- function(x) {
  'number'
}

googleDataType.integer <- function(x) {
  'number'
}

googleDataType.character <- function(x) {
  'string'
}

googleDataType.logical <- function(x) {
  'boolean'
}

googleDataType.factor <- function(x) {
  'string'
}

googleDataType.Date <- function(x) {
  'date'
}

googleDataType.POSIXct <- function(x) {
  'datetime'
}

googleDataType.AsIs <- function(x) {
  googleDataType(as.vector(x))
}

googleDataType.default <- function(x) {
  stop("Don't know how to infer Google DataTable type for vector of ",
       "class '", paste(class(x), collapse='/'), "'; please provide an explicit column ",
       "definition")
}
jcheng5/googleCharts documentation built on Nov. 29, 2020, 5:20 p.m.