[R] Method dispatch

Zhang,Yanwei Yanwei.Zhang at cna.com
Tue Mar 2 00:35:04 CET 2010


Dear Martin,

Thanks a lot for your reply. I do have a namespace and it does seem to be a namespace problem. But this time, it's getting even stranger:

My package name is ChainLadder:

> library(ChainLadder)

> sessionInfo()
R version 2.10.1 (2009-12-14) 
i386-pc-mingw32 

locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] splines   stats     graphics  grDevices utils     datasets  methods  
[8] base     

other attached packages:
[1] ChainLadder_0.1.3-3 systemfit_1.1-4     lmtest_0.9-26      
[4] zoo_1.6-2           car_1.2-16          Matrix_0.999375-33 
[7] lattice_0.17-26     Hmisc_3.7-0         survival_2.35-7    

loaded via a namespace (and not attached):
[1] cluster_1.12.1 grid_2.10.1    tools_2.10.1  


Then I called the main function to create an object "uni2" of class "MultiChainLadder".

> uni2 <- MultiChainLadder(list(GenIns),
+  fit.method="OLS",
+  extrap=TRUE,
+  model="MCL")
> 
> class(uni2)
[1] "MultiChainLadder"
attr(,"package")
[1] "ChainLadder"

The summary function defined for this class "MultiChainLadder" works as desired:

> showMethods(summary)
Function: summary (package base)
object="ANY"
object="MultiChainLadder"
object="sparseMatrix"

> summary(uni2)
$`Summary Statistics for the Input Triangle`
        Latest Dev.To.Date Ultimate        IBNR        S.E        CV
2      5339085  0.98258397  5433719    94633.81   75535.04 0.7981823
3      4909315  0.91271120  5378826   469511.29  121698.56 0.2592026
4      4588268  0.86605315  5297906   709637.82  133548.85 0.1881930
5      3873311  0.79727292  4858200   984888.64  261406.45 0.2654173


However, problems come when I call the "show" function defined for this class, which is essentially the same as the "summary" function, since the default "summary" for class "ANY" is called, not my new method:

> getMethod(show,signature="MultiChainLadder")
Method Definition:

function (object) 
{
    summary(object)
}
<environment: namespace:ChainLadder>

Signatures:
        object            
target  "MultiChainLadder"
defined "MultiChainLadder"
> show(uni2)
          Length            Class             Mode 
               1 MultiChainLadder               S4 


I can't figure out why the call of "summary" within "show" failed. And what is even stranger is that although the showMethods(summary) indicates a method is defined for "MultiChainLadder", I could not find the "summary" function in the namespace "ChainLadder":

> ChainLadder::summary
Error: 'summary' is not an exported object from 'namespace:ChainLadder'
> objects(2)
 [1] "ABC"                 "as.triangle"         "auto"               
 [4] "BootChainLadder"     "chainladder"         "coef"               
 [7] "cum2incr"            "fitted"              "fitted.values"      
[10] "GenIns"              "GenInsLong"          "getLatestCumulative"
[13] "incr2cum"            "Join2Fits"           "JoinFitMse"         
[16] "liab"                "M3IR5"               "MackChainLadder"    
[19] "MCLincurred"         "MCLpaid"             "Mortgage"           
[22] "Mse"                 "MultiChainLadder"    "MunichChainLadder"  
[25] "plot"                "predict"             "qincurred"          
[28] "qpaid"               "RAA"                 "residCov"           
[31] "residuals"           "rstandard"           "vcov"   



I know this is a namespace issue, but I do not know how to fix this. The following is a part of the namespace file, but you can see that I did export the "summary" method in "exportMethods". What did I miss here?  Thanks a lot for your help.



export(MackChainLadder, MunichChainLadder, BootChainLadder, MultiChainLadder)
export(Join2Fits, JoinFitMse, Mse, residCov)

importFrom(stats, quantile, predict, coef, vcov,
              residuals, fitted, fitted.values, rstandard)
importFrom(methods,  show, coerce)
importFrom(graphics, plot)

#Classes
exportClasses(triangles, MultiChainLadder, MultiChainLadderFit,
              MCLFit, GMCLFit, MultiChainLadderMse)
           
#Methods
S3method(plot, MackChainLadder)
S3method(plot, MunichChainLadder)

S3method(summary, MunichChainLadder)
S3method(summary, BootChainLadder)

exportMethods(predict, Mse, summary, show, coerce,
              "[", "$", "[[", names, coef, vcov, residCov,
              residuals, rstandard, fitted, fitted.values, plot)


 


Wayne (Yanwei) Zhang
Statistical Research 
>CNA

-----Original Message-----
From: Martin Morgan [mailto:mtmorgan at fhcrc.org] 
Sent: Monday, March 01, 2010 5:10 PM
To: Zhang,Yanwei
Cc: r-help at r-project.org
Subject: Re: [R] Method dispatch

On 03/01/2010 01:31 PM, Zhang,Yanwei wrote:
> Dear all,
> 
> In a package, I defined a method for "summary" using
setMethod(summary, signature="abc") for my class "abc", but when the
package is loaded, the function "summary(x)" where x is of class "abc"
seems to have called the default summary function for "ANY" class.
Shouldn't it call the method I have defined? How could I get around with
that? Thanks.

Hi Wayne -- It's hard to tell from what you've written, but this and
your earlier question on 'S4 issues' sounds like a NAMESPACE problem.
Are you using a name space? If so, provide additional detail. Also,
verify that you are only loading your package and not another, e.g., one
with a 'summary' generic that is being found before yours.

Probably your best bet is to simplify as much as possible -- I have a
single file in 'pkgA/R', with

  setClass("A", "numeric")
  setMethod("summary", "A", function(object, ...) "A")


> library(pkgA)
> summary(new("A"))
[1] "A"
> sessionInfo()
R version 2.10.1 Patched (2010-02-23 r51168)
x86_64-unknown-linux-gnu

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8
 [5] LC_MONETARY=C              LC_MESSAGES=en_US.UTF-8
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C
 [9] LC_ADDRESS=C               LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] pkgA_1.0

Martin


> 
> 
> Wayne (Yanwei) Zhang
> Statistical Research
> CNA
> 
> 
> 
> 
> 
> NOTICE:  This e-mail message, including any attachments and appended messages, is for the sole use of the intended recipients and may contain confidential and legally privileged information.
> If you are not the intended recipient, any review, dissemination, distribution, copying, storage or other use of all or any portion of this message is strictly prohibited.
> If you received this message in error, please immediately notify the sender by reply e-mail and delete this message in its entirety.
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-help at r-project.org mailing list
> 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.


-- 
Martin Morgan
Computational Biology / Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N.
PO Box 19024 Seattle, WA 98109

Location: Arnold Building M1 B861
Phone: (206) 667-2793



More information about the R-help mailing list