Mercurial > repos > eschen42 > w4mcorcov
diff w4mcorcov_input.R @ 0:23f9fad4edfc draft
planemo upload for repository https://github.com/HegemanLab/w4mcorcov_galaxy_wrapper/tree/master commit bd26542b811de06c1a877337a2840a9f899c2b94
author | eschen42 |
---|---|
date | Mon, 16 Oct 2017 14:56:52 -0400 |
parents | |
children | 50f60f94c034 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/w4mcorcov_input.R Mon Oct 16 14:56:52 2017 -0400 @@ -0,0 +1,201 @@ +# read_data_frame - read a w4m data frame, with error handling +# e.g., data_matrix_input_env <- read_data_frame(dataMatrix_in, "data matrix input") +read_data_frame <- function(file_path, kind_string, failure_action = failure_action) { + my.env <- new.env() + my.env$success <- FALSE + my.env$msg <- sprintf("no message reading %s", kind_string) + tryCatch( + expr = { + my.env$data <- utils::read.delim( fill = FALSE, file = file_path ) + my.env$success <- TRUE + } + , error = function(e) { + my.env$ msg <- sprintf("%s read failed", kind_string) + } + ) + if (!my.env$success) { + failure_action(my.env$msg) + return ( FALSE ) + } + return (my.env) +} + +# read one of three XCMS data elements: dataMatrix, sampleMetadata, variableMetadata +# returns respectively: matrix, data.frame, data.frame, or FALSE if there is a failure +read_xcms_data_element <- function(xcms_data_in, xcms_data_type, failure_action = stop) { + # note that 'stop' effectively means 'throw'; if 'warning' and 'message' are caught, they mean 'throw' as well + my_failure_action <- function(...) { failure_action("read_xcms_data_element: ", ...) } + # xcms_data_type must be in c("sampleMetadata", "variableMetadata", "dataMatrix") + if ( ! is.character(xcms_data_type) ) { + my_failure_action(sprintf("bad parameter xcms_data_type '%s'", deparse(xcms_data_type))) + return ( FALSE ) + } + if ( 1 != length(xcms_data_type) + || ! ( xcms_data_type %in% c("sampleMetadata", "variableMetadata", "dataMatrix") ) + ) { + my_failure_action( sprintf("bad parameter xcms_data_type '%s'", xcms_data_type) ) + return ( FALSE ) + } + if ( is.character(xcms_data_in) ){ + # case: xcms_data_in is a path to a file + xcms_data_input_env <- read_data_frame( xcms_data_in, sprintf("%s input", xcms_data_type) ) + if (!xcms_data_input_env$success) { + my_failure_action(xcms_data_input_env$msg) + return ( FALSE ) + } + return ( xcms_data_input_env$data ) + # commenting out pasted code that is not tested here + # } else if ( is.data.frame(xcms_data_in) || is.matrix(xcms_data_in) ) { + # # case: xcms_data_in is a data.frame or matrix + # return(xcms_data_in) + # } else if ( is.list(xcms_data_in) || is.environment(xcms_data_in) ) { + # # NOTE WELL: is.list succeeds for data.frame, so the is.data.frame test must appear before the is.list test + # # case: xcms_data_in is a list + # if ( ! exists(xcms_data_type, where = xcms_data_in) ) { + # my_failure_action(sprintf("%s xcms_data_in is missing member '%s'"), ifelse(is.environment(xcms_data_in),"environment","list"), xcms_data_type) + # return ( FALSE ) + # } + # prospect <- getElement(name = xcms_data_type, object = xcms_data_in) + # if ( ! is.data.frame(prospect) && ! is.matrix(prospect) ) { + # utils::str("list - str(prospect)") + # utils::str(prospect) + # if ( is.list(xcms_data_in) ) { + # my_failure_action(sprintf("the first member of xcms_data_in['%s'] is neither a data.frame nor a matrix but is a %s", xcms_data_type, typeof(prospect))) + # } else { + # my_failure_action(sprintf("the first member of xcms_data_in$%s is neither a data.frame nor a matrix but is a %s", xcms_data_type, typeof(prospect))) + # } + # return ( prospect ) + # } + # # stop("stopping here for a snapshot") + # return ( prospect ) + } else { + # case: xcms_data_in is invalid + my_failure_action( sprintf("xcms_data_in has unexpected type %s", typeof(xcms_data_in)) ) + return ( FALSE ) + } +} + +read_inputs <- function(input_env, failure_action = print) { + if ( ! is.environment(input_env) ) { + failure_action("read_inputs: fatal error - 'input_env' is not an environment") + return ( FALSE ) + } + + if (!is.null(sampleMetadata_in <- input_env$sampleMetadata_in)) { + # --- + # read in the sample metadata + read_data_result <- tryCatchFunc( + expr = { + read_xcms_data_element(xcms_data_in = sampleMetadata_in, xcms_data_type = "sampleMetadata") + } + ) + if ( read_data_result$success ) { + smpl_metadata <- read_data_result$value + } else { + failure_action(read_data_result$msg) + return ( FALSE ) + } + + # extract rownames + rownames(smpl_metadata) <- smpl_metadata[,1] + + input_env$smpl_metadata <- smpl_metadata + # ... + } else { + failure_action("read_inputs: fatal error - 'sampleMetadata_in' is missing from 'input_env'") + return ( FALSE ) + } + + if (!is.null(variableMetadata_in <- input_env$variableMetadata_in)) { + # --- + # read in the variable metadata + read_data_result <- tryCatchFunc( + expr = { + read_xcms_data_element(xcms_data_in = variableMetadata_in, xcms_data_type = "variableMetadata") + } + ) + if ( read_data_result$success ) { + vrbl_metadata <- read_data_result$value + } else { + failure_action(read_data_result$msg) + return (FALSE) + } + + + # extract rownames (using make.names to handle degenerate feature names) + err.env <- new.env() + err.env$success <- FALSE + err.env$msg <- "no message setting vrbl_metadata rownames" + tryCatch( + expr = { + rownames(vrbl_metadata) <- make.names( vrbl_metadata[,1], unique = TRUE ) + vrbl_metadata[,1] <- rownames(vrbl_metadata) + err.env$success <- TRUE + } + , error = function(e) { + err.env$ msg <- sprintf("failed to set rownames for vrbl_metadata read because '%s'", e$message) + } + ) + if (!err.env$success) { + failure_action(err.env$msg) + return ( FALSE ) + } + + input_env$vrbl_metadata <- vrbl_metadata + # ... + } else { + failure_action("read_inputs: fatal error - 'variableMetadata_in' is missing from 'input_env'") + return ( FALSE ) + } + + if (!is.null(dataMatrix_in <- input_env$dataMatrix_in)) { + # --- + # read in the data matrix + read_data_result <- tryCatchFunc( + expr = { + read_xcms_data_element(xcms_data_in = dataMatrix_in, xcms_data_type = "dataMatrix") + } + ) + if ( read_data_result$success ) { + data_matrix <- read_data_result$value + } else { + failure_action(read_data_result$msg) + return (FALSE) + } + + if ( ! is.matrix(data_matrix) ) { + # extract rownames (using make.names to handle degenerate feature names) + err.env <- new.env() + err.env$success <- FALSE + err.env$msg <- "no message setting data_matrix rownames" + tryCatch( + expr = { + rownames(data_matrix) <- make.names( data_matrix[,1], unique = TRUE ) + err.env$success <- TRUE + } + , error = function(e) { + err.env$msg <- sprintf("failed to set rownames for data_matrix read because '%s'", e$message) + } + ) + if (!err.env$success) { + failure_action(err.env$msg) + return ( FALSE ) + } + + # remove rownames column + data_matrix <- data_matrix[,2:ncol(data_matrix)] + + # convert data_matrix to matrix from data.frame + data_matrix <- as.matrix(data_matrix) + } + + input_env$data_matrix <- data_matrix + # ... + } else { + failure_action("read_inputs: fatal error - 'dataMatrix_in' is missing from 'input_env'") + return ( FALSE ) + } + + return ( TRUE ) +} +