[R] How do I modify an exported function in a locked environment?

Steven McKinney smckinney at bccrc.ca
Thu Jul 20 21:49:14 CEST 2006



Running R.app on Mac OS X 10.4

> version
               _                         
platform       powerpc-apple-darwin8.6.0 
arch           powerpc                   
os             darwin8.6.0               
system         powerpc, darwin8.6.0      
status                                   
major          2                         
minor          3.1                       
year           2006                      
month          06                        
day            01                        
svn rev        38247                     
language       R                         
version.string Version 2.3.1 (2006-06-01)
> 


I am trying to learn how to modify functions
in a locked environment.

For an example, suppose I'm using the package "zoo".

zoo contains function "rollmean.default"

> rollmean.default
function (x, k, na.pad = FALSE, align = c("center", "left", "right"), 
    ...) 
{
    x <- unclass(x)
    n <- length(x)
    y <- x[k:n] - x[c(1, 1:(n - k))]
    y[1] <- sum(x[1:k])
    rval <- cumsum(y)/k
    if (na.pad) {
        rval <- switch(match.arg(align), left = {
            c(rval, rep(NA, k - 1))
        }, center = {
            c(rep(NA, floor((k - 1)/2)), rval, rep(NA, ceiling((k - 
                1)/2)))
        }, right = {
            c(rep(NA, k - 1), rval)
        })
    }
    return(rval)
}
<environment: namespace:zoo>

Suppose for whatever reason I want output to be
in percent, so I'd like to modify the result to be
rval <- 100 * cumsum(y)/k

I cannot just copy the function and change it, as the namespace
mechanism ensures the rollmean.default in 'zoo' continues to be used.

If I use
fixInNamespace("rollmean.default", ns = "zoo")
I can edit the rval <- cumsum(y)/k line to read
rval <- 100 * cumsum(y)/k
save the file and exit the R.app GUI editor.

But this does not update the exported copy of the
function (the documentation for fixInNamespace says
this is the case) - how do I accomplish this last step?

If I list the function after editing, I see the original
copy.  But if I reinvoke the editor via fixInNamespace(),
I do see my modification.
Where is my copy residing?  How do I push it out
to replace the exported copy?

Is this the proper way to modify a package function?
Are there other ways?  I've searched webpages, R news,
help files and have been unable to find out how to
get this process fully completed.

Any guidance appreciated.


Steven McKinney

Statistician
Molecular Oncology and Breast Cancer Program
British Columbia Cancer Research Centre

email: smckinney at bccrc.ca

tel: 604-675-8000 x7561

BCCRC
Molecular Oncology
675 West 10th Ave, Floor 4
Vancouver B.C. 
V5Z 1L3
Canada



More information about the R-help mailing list