Nothing
TYPETABLE <- list(
MySQLWB=c(
"^TINYINT([()].*[)])?$", "TINYINT", "logical",
"^BIGINT([()].*[)])?$", "BIGINT", "integer",
"^INT([()].*[)])?$", "INT", "integer",
"^SMALLINT([()].*[)])?$", "SMALLINT", "integer",
"^DOUBLE([()].*[)])?$", "DOUBLE", "numeric",
"^FLOAT([()].*[)])?$", "FLOAT", "numeric",
"^DECIMAL([()].*[)])?$", "DECIMAL", "numeric",
"^VARCHAR([()].*[)])?$", "VARCHAR", "character",
"^TEXT([()].*[)])?$", "TEXT", "character",
"^TINYTEXT([()].*[)])?$", "TINYTEXT", "character",
"^LONGTEXT([()].*[)])?$", "LONGTEXT", "character",
"^MEDIUMTEXT([()].*[)])?$", "MEDIUMTEXT", "character",
"^BLOB([()].*[)])?$", "BLOB", "base64",
"^LONGBLOB([()].*[)])?$", "LONGBLOB", "base64",
"^MEDIUMBLOB([()].*[)])?$", "MEDIUMBLOB", "base64",
"^TINYBLOB([()].*[)])?$", "TINYBLOB", "base64",
"^DATETIME([()].*[)])?$", "DATETIME", "POSIXct",
"^DATE([()].*[)])?$", "DATE", "Date",
"^ENUM([()].*[)])?$", "ENUM", "character",
"^SET([()].*[)])?$", "SET", "character"
) %>%
matrix(
ncol=3, byrow=TRUE,
dimnames=list(NULL, c("match", "inst", "R"))
) %>%
dplyr::as_tibble(),
ClickHouse=c(
"Int32", "Int32", "integer",
"Float64", "Float64", "numeric",
"UInt8", "UInt8", "logical",
"String", "String", "character",
"Date", "Date", "Date",
"DateTime", "DateTime", "POSIXct",
"Array(String)", "Array(String)", "base64"
) %>%
matrix(
ncol=3, byrow=TRUE,
dimnames=list(NULL, c("match", "inst", "R"))
) %>%
dplyr::as_tibble()
)
###############################################################################@
#' Supported R types
#'
#' @export
#'
SUPPTYPES <- c(
"integer", "numeric", "logical", "character", "Date", "POSIXct", "base64"
)
###############################################################################@
#' List supported types references
#'
#' @export
#'
list_type_ref <- function(){
names(TYPETABLE)
}
###############################################################################@
#' Normalize type names
#'
#' @param x a character vector to normalize
#' @param typeRef a character vector of length one: the type
#' reference ([list_type_ref])
#' @param ignore.case should case be ignored (default: TRUE)
#'
#' @export
#'
norm_type_ref <- function(x, typeRef, ignore.case=TRUE){
stopifnot(is.character(x))
typeRef <- match.arg(typeRef, list_type_ref())
ntypes <- unique(TYPETABLE[[typeRef]] %>% dplyr::pull("match"))
toRet <- x
for(nt in ntypes){
toRet <- sub(
nt,
nt,
toRet,
ignore.case=ignore.case
)
}
return(toRet)
}
###############################################################################@
#' Convert a set of types from or to R supported types
#'
#' @param x a character vector of types to be converted. If from is not null,
#' x should be a set of valid types in the from reference. If to is not null,
#' x should be a set of supported R types (SUPPTYPES).
#' @param from a character vector of length one: the type reference
#' ([list_type_ref]) of x
#' @param to a character vector of length one: the targeted type reference
#' ([list_type_ref])
#' @param ignore.case should case be ignored when converting `from``
#' type reference (default: TRUE)
#'
#' @details Only `from` XOR `to` should be set
#'
#' @export
#'
conv_type_ref <- function(x, from=NULL, to=NULL, ignore.case=TRUE){
stopifnot(
!is.null(from) | !is.null(to),
is.null(from) | is.null(to)
)
if(!is.null(from)){
r <- match.arg(from, list_type_ref())
ct <- TYPETABLE[[r]]
x <- norm_type_ref(x, from, ignore.case=ignore.case)
notSupported <- setdiff(x, ct %>% dplyr::pull("match"))
if(length(notSupported)>0){
stop(paste(
sprintf("The following types are not supported %s types:", r),
paste(notSupported, collapse=", ")
))
}
toRet <- ct %>% dplyr::slice(match(x, .data$match)) %>% dplyr::pull("R")
}
if(!is.null(to)){
r <- match.arg(to, list_type_ref())
ct <- TYPETABLE[[r]]
check_types(x)
toRet <- ct %>% dplyr::slice(match(x, .data$R)) %>% dplyr::pull("inst")
}
return(toRet)
}
###############################################################################@
#' Check if a set of types is supported
#'
#' @param x a character vector of types to be checked
#'
#' @export
#'
check_types <- function(x){
stopifnot(is.character(x))
notSupported <- setdiff(x, SUPPTYPES)
if(length(notSupported)>0){
stop(paste(
"The following types are not supported:",
paste(notSupported, collapse=", ")
))
}
}
###############################################################################@
#' Convert an object into a specific type
#'
#' @param x an object to convert
#' @param type the targeted type
#'
#' @export
#'
as_type <- function(x, type){
type <- match.arg(type, SUPPTYPES)
return(switch(
type,
"integer"=as.integer(x),
"numeric"=as.numeric(x),
"logical"=as.logical(x),
"character"=as.character(x),
"Date"=as.Date(x),
"POSIXct"=as.POSIXct(x),
"base64"=if(length(x)==0){
character(0)
}else{
unlist(lapply(x, function(y){
if(length(y)==0 || (length(y)==1 && is.na(y))){
return(NA)
}else{
paste(y, collapse="")
}
}))
}
))
}
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.