view tostr.R @ 1:253d531a0193 draft

planemo upload for repository https://github.com/workflow4metabolomics/lcmsmatching.git commit 36c9d8099c20a1ae848f1337c16564335dd8fb2b
author prog
date Sat, 03 Sep 2016 17:02:01 -0400
parents e66bb061af06
children
line wrap: on
line source

source("tolst.R")

# Convert lists and objects to string representation. Supported outputs are:
#   _ Text.
#   _ PHP code.
#   _ R code (to be done).

##########################
# SET STRING TO VARIABLE #
##########################

# str   The value converted to a string.
# mode  The mode to use.
# var   Variable name.
.set_str_to_variable <- function(str, mode = 'txt', var = NA_character_) {

	# Add variable
	switch(mode,
	       txt = { str <- paste(var, '=', str) },
	       php = { str <- paste0('$', var, ' = ', str, ';') },
	       stop("Unknown mode '", mode, "'.")
		  )

	return(str)
}

################
# QUOTE VALUES #
################

# values    A vector of values.
# mode      The mode to use.
# keys      If the vector contains keys of a dictionary structured (depending on the mode, they will be quoted or not).
.quote_values <- function(values, mode = 'txt', keys = FALSE) {

	if (mode == 'txt' && keys)
		return(values)

	# Quote string values
	# TODO escape quote characters
	if (is.character(values))
		return(unlist(lapply(values, function(x) { paste0('"', x, '"') } )))

	return(values)
}

############
# SET KEYS #
############

# values    Vector or list of values.
# mode      The mode to use.
.set_keys <- function(values, mode = 'txt') {

	if ( ! is.null(names(values))) {
		keys <- names(values)
		indices <- 1:length(values)
		switch(mode,
	       	   txt = { values <- lapply(indices, function(x) paste( if (nchar(keys[[x]]) == 0) x else keys[[x]], '=>', values[[x]])) },
	       	   php = { values <- lapply(names(values), function(x) paste0('"', if (nchar(keys[[x]]) == 0) x else keys[[x]], '"', ' => ', values[[x]])) },
	       	   stop("Unknown mode '", mode, "'.")
		  	  )
	}

	return(values)
}

###############
# JOIN VALUES #
###############

# values    Vector or list of values to join.
# mode      The mode to use.
.join_values <- function(values, mode = 'txt') {

	switch(mode,
	       txt = { str <- paste0('(', paste(values, collapse = ', '), ')') },
	       php = { str <- paste0('[', paste(values, collapse = ', '), ']') },
	       stop("Unknown mode '", mode, "'.")
		  )

	return(str)
}

###############
# NULL TO STR #
###############

# value The NULL or NA value, or the vector of length 0.
# mode  The mode to use.
# var   Variable name.
.null_to_str <- function(value, mode = 'txt', var = NA_character_) {

	# Set to 'null' string
	switch(mode,
	       txt = { str <- if (length(value) > 0 && is.na(value)) 'NA' else 'null' },
	       php = { str <- 'NULL' },
	       stop("Unknown mode '", mode, "'.")
		  )

	if ( ! is.null(var) && ! is.na(var))
		str <- .set_str_to_variable(str, mode, var)

	return(str)
}

################
# VALUE TO STR #
################

# TODO hide this function ? value_to_str -> .value_to_str

# value The value to convert.
# mode  The mode to use.
# var   Variable name.
# lst   If true, print the output as a list or array, even if it contains only one value.
.value_to_str <- function(value, mode = 'txt', var = NA_character_, lst = FALSE) {

	if (is.null(value) || (length(value) == 0 && ! lst) || (length(value) > 0 && is.na(value)))
		return(.null_to_str(value, mode = mode, var = var))

	# Transform value to a string
	value <- .quote_values(value, mode = mode)
	str <- if (length(value) == 1 && ! lst && is.null(names(value))) as.character(value) else .join_values(.set_keys(value, mode = mode), mode = mode)

	# Set to variable
	if ( ! is.null(var) && ! is.na(var))
		str <- .set_str_to_variable(str, mode, var)

	return(str)
}

###############
# LIST TO STR #
###############

# vlist The list to convert.
# mode  The mode to use.
# var   Variable name.
# lst   If true, print the output as a list or array, even if it contains only one value.
.list_to_str <- function(vlist, mode = 'txt', var = NA_character_, lst = FALSE) {

	if (is.null(vlist) || (length(vlist) == 0 && ! lst) || (length(vlist) > 0 && is.na(vlist)))
		return(.null_to_str(vlist, mode = mode, var = var))

	# 
	vstr <- character()
	if (length(vlist) > 0) {
		keys <- unlist(lapply(names(vlist), function(x) if (nchar(x) == 0) x else .quote_values(x, mode = mode, keys = TRUE)))
		values <- lapply(vlist, function(x) tostr(x, mode = mode))
		sep <- switch(mode,
	              	  txt = '=>',
	              	  php = '=>',
		          	  stop("Unknown mode '", mode, "'.")
		         	 )
		vstr <- unlist(lapply(1:length(vlist), function(i) if (is.null(keys) || nchar(keys[i]) == 0) values[[i]] else paste(keys[i], sep, values[[i]])))
	}

	# Join string values
	if (length(vstr) > 1 || lst || ! is.null(keys))
		str <- .join_values(vstr, mode = mode)
	else
		str <- vstr
			
	# Set to variable
	if ( ! is.null(var) && ! is.na(var))
		str <- .set_str_to_variable(str, mode, var)

	return(str)
}

##########
# TO STR #
##########

# obj   The object to convert.
# mode  The mode to use.
# var   Variable name.
# lst   If true, print the output as a list or array, even if it contains only one value.
tostr <- function(obj, mode = 'txt', var = NA_character_, lst = FALSE) { 

	switch(typeof(obj),
	       S4   = str <- tostr(tolst(obj), mode = mode, var = var, lst = lst),
	       list = str <- .list_to_str(obj, mode = mode, var = var, lst = lst),
	              str <- .value_to_str(obj, mode = mode, var = var, lst = lst)
	      )
		
	return(str)
}