Update, I have decided to make use S4 in order to solve my problem. Are there any particular resources that might be helpful. Thanks you for all of the help. kindest regards,
STephen On Tue, Feb 21, 2017 at 10:52 AM, William Dunlap <wdun...@tibco.com> wrote: > Stray attributes on data.frames may or may not survive some simple > operations on the data.frame. E.g., > > > d <- data.frame(X=1:5, Y=log(1:5), G=factor(rep(c("a","b"),c(2,3)))) > > attr(d, "checked") <- TRUE > > wasChecked <- function(x) isTRUE(attr(x, "checked")) > > wasChecked(d) > [1] TRUE > > wasChecked(d[1:4,]) # select some rows > [1] TRUE > > wasChecked(d[,1:2]) # select some columns > [1] FALSE > > d[1,1] <- 10 # change a single value > > wasChecked(d) > [1] TRUE > > d$NewColumn <- 11:15 # add a column > > wasChecked(d) > [1] TRUE > > I don't know if this would be an issue in your case. If it is, you > could subclass "data.frame" and define methods so that the operations > of interest preserve or remove the attribute in the way that you > desire. > > Bill Dunlap > TIBCO Software > wdunlap tibco.com > > > On Tue, Feb 21, 2017 at 8:30 AM, Charles C. Berry <ccbe...@ucsd.edu> > wrote: > > 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. > -- Let's not spend our time and resources thinking about things that are so little or so large that all they really do for us is puff us up and make us feel like gods. We are mammals, and have not exhausted the annoying little problems of being mammals. -K. Mullis "A big computer, a complex algorithm and a long time does not equal science." -Robert Gentleman [[alternative HTML version deleted]] ______________________________________________ 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.