On Tue, 21 Feb 2017, stephen sefick wrote:
Sorry for not being clear. I have never used S3 methods before. Below is some R code that sketches out my idea. Is this a sensible solution?
Sure. See comments (untested) inline. Chuck
test_data <- data.frame(a=1:10, b=1:10, c=1:10) functionA <- function(x, impossible_genotype){ ##some data processing y <- x ##return S3 to be able to use impossible genotype later class(y) <- append(class(y),"genotypes")
class(y) <- c("genotypes",class(y))
attr(y, "impossible_genotype") <- impossible_genotype return(y) } test_data_genotypes <- functionA(test_data, impossible_genotype="Ref") functionB <- function(x){ ##stop if pre-processed with functionA if(sum(class(x)=="genotypes")!=1){stop("Need to pre-process data with functionA")}
if(!(inherits("genotypes")){ stop("Need to pre-process data with functionA")} or in functionA you could skip the class()<- and just set the "impossible_genotypes" attribute to FALSE when there are none such. Then here test if (is.null(attr(x,"impossible_genotypes"))){ stop("Need to pre-process data with functionA") } else { return(alleles) }
##use this later in functionB to impossible_genotype <- attributes(x)$impossible_genotype
impossible_genotype <- attr(x,"impossible_genotype")
alleles <- c("Ref", "Alt") coded_genotype <- alleles[alleles!=impossible_genotype]
maybe `!is.element(alleles,impossible_genotype)' is safer than `!='
return(coded_genotype) } ##stop if not pre-processed with functionA functionB(test_data) ##processed with functionA functionB(test_data_genotypes)
______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.