Skip to content

RC / methods package

2 messages · Paul Gilbert, John Chambers

#
(I think this is being caused by the new methods package in RC.)

In the RC (March 24) some of my packages are generating a Note

Note: Method with signature "MySQLConnection#integer" chosen for 
function "coerce",
  target signature "TSMySQLConnection#integer".
  "dbObjectId#integer" would also be valid

This is coming from a call to dbGetQuery() in package DBI. The method 
with the signature "TSMySQLConnection#integer" is generated 
automatically because TSMySQLConnection inherits from
MySQLConnection. (More details below.)

Is there a way to pass this information along to coerce when the method 
is generated, or otherwise suppress the Note?

BTW,
  1/ It would be nice if the Note mentioned what method is generating 
it, in addition to the signature. Debugging for a call several levels 
deep in the stack is already hard enough.

  2/ The note only seems to get generated on the first call and then 
gets suppressed. This will be nice for users, but makes debugging 
harder. Is there a way to prevent suppressing the message?

  3/ It seems strange that  getMethod() cannot find the methods even 
though showMethods() shows it. (See below.)

Paul
________

 >showMethods("dbGetQuery")
Function: dbGetQuery (package DBI)
conn="MySQLConnection", statement="character"

 >   z <- TSget("Series 1", con, TSrepresentation="timeSeries")
Note: Method with signature "MySQLConnection#integer" chosen for 
function "coerce",
  target signature "TSMySQLConnection#integer".
  "dbObjectId#integer" would also be valid
Loading required package: zoo

Attaching package: ?zoo?

The following object(s) are masked from ?package:timeSeries?:

     time<-

The following object(s) are masked from ?package:base?:

     as.Date, as.Date.numeric

 >  showMethods("dbGetQuery")
Function: dbGetQuery (package DBI)
conn="MySQLConnection", statement="character"
conn="TSMySQLConnection", statement="character"
     (inherited from: conn="MySQLConnection", statement="character")

 > getMethod("dbGetQuery",  signature = c("TSMySQLConnection", 
statement="character"))
Error in getMethod("dbGetQuery", signature = c("TSMySQLConnection", 
statement = "character")) :
   No method found for function "dbGetQuery" and signature 
TSMySQLConnection, character
 >
#
On 3/24/12 1:29 PM, Paul Gilbert wrote:
Possibly, but the methods package isn't particularly "new" in its method 
selection.

We need to see the definition of the class.  The note implies that it 
inherits from both "MySQLConnection" and "dbObjectId", both of which 
have methods for coercing to "integer".  Hence the ambiguity.
No.  Methods are inherited according to rules implied by the class 
inheritance; R doesn't allow you to override the inheritance, other than 
by being more explicit about the method definition.  (It's only a note, 
and IMO a relevant one.  Be glad the language isn't Dylan, which treats 
similar ambiguities as a programming error. :-))
?? it does, for coerce()  which admittedly you have to know is the 
method defined for as(thing, "integer") either directly or indirectly.  
Unless you mean showing you the whole method definition, but that seems 
not relevant to selection.

If you wanted to see the coerce() method, you need to do 
showMethods("coerce"), but I don't think that's relevant.  As mentioned, 
it's the class hierarchy that matters.
No.  the note is generated when an inherited method is found.  That 
method is then cached, so the computations required are (fortunately) 
not repeated.

It would be nice to have tools that the package writer could apply to 
generate all possible inheritance patterns, and flag possible 
ambiguities at package INSTALL time, as opposed to when the package is 
used.  But it's likely that would generate so many cases unlikely to 
occur that the package developer would ignore it, even assuming the 
developer was energetic enough to use the tool in the first place.
I think you're confusing getMethod(), which only finds directly defined 
methods, with selectMethod() which replicates the inheritance computations.

In any case the selection of the method has been specified for you already.

John