Skip to content

changing (core) function argument defaults?

4 messages · RenE J.V. Bertin, Spencer Graves, Bert Gunter +1 more

#
>From: Patrick Connolly <p.connolly at hortresearch.co.nz>
>To: "RenE J.V. Bertin" <rjvbertin at hotmail.com>
>Subject: Re: [R] changing (core) function argument defaults?
>Date: Thu, 18 Nov 2004 11:43:10 +1300

>
>On Wed, 20-Oct-2004 at 07:48PM +0200, RenE J.V. Bertin wrote:
>
>|> Hello,
>|>
>
>|> Is it possible to change the defaults for the arguments to a
>|> function, without changing the function code itself?  I'm asking
>|> because I'd like to override the default dimensions and font 
family
>|> for a graphics device. Before 2.0.0, I'd just do that with a small
>|> edit in the appropriate .R file containing the device function
>|> definition. I appears to be possible no longer. So rather than
>|> copying the definition into my own .Rprofile, it would be nice if
>|> just the defaults could be modified...
>
>I didn't notice a response to this question.  I'd like to do something
>similar and haven't been able to work out how to do it.
>
>
>best
>
>--
>Patrick Connolly
>HortResearch
>Mt Albert
>Auckland
>New Zealand
>Ph: +64-9 815 4200 x 7188

No, I haven't noticed a reply to this question neither.

Best,
René Bertin
#
Under the S3 standard, you could make a local copy of any function 
and change the defaults in that local copy.  That may not always work 
under the S4 standard methods dispatch going to code hidden in 
namespaces.  In any event, it should be easy (and safer) to write a 
function with a slightly different name, e.g., adding a dot "." to the 
end of the name, that would have different defaults and would do nothing 
but call the function of interest.  This might be safer

      I don't have any suggestions about changing graphics defaults 
other than to ask for that specifically -- e.g., by changing the subject 
line to this email. 

      hope this helps.  spencer graves
RenE J.V. Bertin wrote:

            

  
    
#
Yes, I think for all practical purposes it (usually?) is. Here's an example.
Suppose I wish to change the default "constant" argument of mad from 1.48 to
2. Then
function (x, center = median(x), constant = 2, na.rm = FALSE, 
    low = FALSE, high = FALSE) 
{
    if (na.rm) 
        x <- x[!is.na(x)]
    n <- length(x)
    constant * if ((low || high) && n%%2 == 0) {
        if (low && high) 
            stop("`low' and `high' can't be both TRUE")
        n2 <- n%/%2 + as.integer(high)
        sort(abs(x - center), partial = n2)[n2]
    }
    else median(abs(x - center))
}

If you now attach the workspace/environment containing this newly defined
mad function to the search list before the stats package (which contains the
original mad()) you have effectively changed the default argument without
changing the function.

I hope experts will let us know when this can't be done (perhaps with
.internal functions or non-exported functions in namespaces, though it isn't
clear to me that one couldn't manually export them and do this here, too).

Of course, all the usual warnings about masking existing functions apply.

Cheers,

-- Bert Gunter
Genentech Non-Clinical Statistics
South San Francisco, CA
 
"The business of the statistician is to catalyze the scientific learning
process."  - George E. P. Box
#
Berton Gunter <gunter.berton at gene.com> writes:
Actually, formals(mad)$constant<-2 will do the same. In either case,
you need to be careful to note that the environment of the function is
changed to the current frame. So if you redefine median(), this will
be picked up by your mad(), but not by stats::mad().
I'd expect that it works whenever the function has default arguments
to modify (.Primitive functions do not). The namespace mechanism only
ensures that you don't overwrite the original, and that packages
expecting to use the original can continue to do so.
Yes, R is not preventing users from shooting themselves in the foot,
nor preventing package writers from shooting users in the foot (as a
recent query involving [.factor showed).