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.

Reply via email to