"Jens Oehlschlägel"
2004-Feb-27 19:15 UTC
[Rd] Re: [R] Is there a way to deactivate partial matching in R?
Dear Prof. Ripley, Thank you for reminding me to the possibility to place the dots as first argument. If this is the solution against partial argument matching, we e.g. cannot safely define a plot method which gives a demo plot in case of no object (because we have to obey the class paramter conventions). plot.someobject <- function(x=NULL, ...) # another example would be paramter pairs where the second one is optional like in plot.someobject(xAndOry, yOptional=NULL, ...) # the standard plot(x, y=NULL, ...) is a safe exception # I agree that such examples can be avoided, but I ran into my problem after 6 years experience with S. # My actual example had the following structure makeoutput <- function(outchannel=NULL, ...){ if (is.null(outchannel)) outchannel <- activechannel ## for each in ... output to outchannel } # as outchannel was usually specified and only occasionally the default used, # it was more 'natural' (and lazy) to call it makeoutput(mychannel, ...) # compared to makeoutput(..., outchannel=mychannel) # standard use is makeoutput(thischannel, element1name=element1content, element2name=element2content) # with an option to send to the active channel as default called like makeoutput(element1name=element1content, element2name=element2content) # calling this as do.call("makeoutput", ll) # where ll <- list(out=outcontent, whatever=whatevercontent) # actually generates the nonsense call makeoutput(outchannel=outcontent, whatever=whatevercontent) # I still find it difficult to write reliable code in R. # I am always afraid to run into something like> # simple example for dangerous partial list matching > > increment.counters <- function(..., mycounters){+ inclist <- list(...) + for (i in seq(along=inclist)) + mycounters[[names(inclist[i])]] <- mycounters[[names(inclist[i])]] + inclist[[i]] + mycounters + }> > mycounters <- list(leftcounter=0, rightcounter=0) > # intended use > mycounters <- increment.counters(leftcounter=4, mycounters=mycounters) > mycounters$leftcounter [1] 4 $rightcounter [1] 0> > # now let me have a typo > mycounters <- increment.counters(leftcounte=4, mycounters=mycounters) > # and my increment silently misses its target, and I have an additionalnonsense counter> mycounters$leftcounter [1] 4 $rightcounter [1] 0 $leftcounte [1] 8 Best Jens Oehlschl?gel P.S. I am not subscribed to r-devel --