Ross Boylan <[EMAIL PROTECTED]> writes: > On Fri, Nov 24, 2006 at 11:23:14AM -0800, Ross Boylan wrote: >> Using R 2.4, the following fails: >> setClass("testc", representation(a="ANY")) >> makeC <- function(myarg) new("testc", a=myarg) >> makeC() >> -> Error in initialize(value, ...) : argument "myarg" is missing, >> with no default
The following might offer one paradigm: makeC <- function(myarg) { new("testc", a=if (missing(myarg)) character(0) else myarg) } A couple of things that come to mind, though: 'ANY' kind of defeats the purpose of having a class with well-defined slots (I realize this is a 'toy' example); presenting myarg without a default makes it obscure to the user what the default value might be, or that a default value will be used; if 'myarg' is an appropriately descriptive argument for the user, then perhaps it is also appropriately descriptive for the slot. Thus: setClass("testc", representation(myarg="character")) makeC <- function(myarg=character(0)) new("testc", myarg=myarg) > .... >> >> I suspect there's something I could do to get the constructor >> arguments, modify the list (i.e., delete args that were missing and >> insert new ones), and do.call(new, myArgList). Not only am I unsure >> how to do that (or if it would work), I'm hoping there's a better way. > > I didn't find a way to get all the arguments easily(*), but manually as.list(match.call()[-1]) might help > constructing the list works. Here are fragments of the code: > > mspathCoefficients <- function( > aMatrix, > params, > offset=0, > baseConstrVec, > covLabels # other args omitted > ) { > # innerArgs are used with do.call("new, innerArgs) > innerArgs <- list( > Class = "mspathCoefficients", > aMatrix = aMatrix, > baseConstrVec = as.integer(baseConstrVec), > params = params > ) > > # the next block inserts the covLabels argument > # only if it is non-missing > if (missing(covLabels)) { > # .... > } else { > innerArgs$covLabels <- covLabels > } > #... > map <- list() > # fill in the map > # add it to the arguments > innerArgs$map <- map > do.call("new", innerArgs) > } > > This calls new("mspathCoefficients", ...) with just the non-missing > arguments. The constructed object has appropriately "missing" values > in the slots (e.g., character(0) given a slot of type "character"). > > > (*) Inside the function, arg <- list(...) will capture the unnamed > arguments, but I don't have any. as.list(sys.frame(sys.nframe()) is > closer to what I was looking for, though all the values are promises. > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel -- Martin T. Morgan Bioconductor / Computational Biology http://bioconductor.org ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel