An embedded and charset-unspecified text was scrubbed... Name: not available URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20121107/ea6ff9a7/attachment.pl>
Question on callNextMethod
3 messages · Simon Knapp, Charles C. Berry, Martin Morgan
Simon Knapp <sleepingwell at gmail.com> writes:
I don't understand why I get the following results. I define two classes 'Base' and 'Derived', the latter of which 'contains' the first. I then define a generic method 'test' and overload it for each of these classes. I call 'callNextMethod()' in the overload for Derived. From the output, it appears that the overload for Base gets called twice. Why is this? Test
Autoprinting has tricked you.
a <-test(d) # What you expected
[1] "derived\ncalled" [1] "base called"
a # what was autoprinted
[1] "base called"
HTH, Chuck
code follows:
setClass('Base')
setClass('Derived', contains='Base')
setGeneric('test', function(x) standardGeneric('test'))
setMethod('test', signature(x='Base'), function(x) print('base called'))
setMethod('test', signature(x='Derived'), function(x) {print('derived
called'); callNextMethod()})
d = new('Derived')
test(d)
Produces the output:
[1] "derived called"
[1] "base called"
[1] "base called"
and I was expecting:
[1] "derived called"
[1] "base called"
Thanx in advance,
Simon Knapp
[[alternative HTML version deleted]]
Charles C. Berry Dept of Family/Preventive Medicine cberry at ucsd edu UC San Diego http://famprevmed.ucsd.edu/faculty/cberry/ La Jolla, San Diego 92093-0901
On 11/06/2012 07:03 AM, Simon Knapp wrote:
I don't understand why I get the following results. I define two classes
'Base' and 'Derived', the latter of which 'contains' the first. I then
define a generic method 'test' and overload it for each of these classes. I
call 'callNextMethod()' in the overload for Derived. From the output, it
appears that the overload for Base gets called twice. Why is this? Test
code follows:
setClass('Base')
setClass('Derived', contains='Base')
setGeneric('test', function(x) standardGeneric('test'))
setMethod('test', signature(x='Base'), function(x) print('base called'))
setMethod('test', signature(x='Derived'), function(x) {print('derived
called'); callNextMethod()})
d = new('Derived')
test(d)
Produces the output:
[1] "derived called"
[1] "base called"
[1] "base called"
Fun; I think you're seeing the print command, and also the (normally invisible)
return value from print
> d = new('Derived')
> res = test(d)
[1] "derived called"
[1] "base called"
> res
[1] "base called"
similar to
> print("x")
[1] "x"
> (print("x"))
[1] "x"
[1] "x"
Martin
and I was expecting: [1] "derived called" [1] "base called" Thanx in advance, Simon Knapp [[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.
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