[R] How to modify a S4 function (in the package NADA)
Sarah Goslee
sarah.goslee at gmail.com
Thu Nov 15 15:36:35 CET 2012
Thanks for the clarification, Martin. Since I couldn't reproduce the
example, I didn't get to see what was actually being returned (and
was, admittedly, too lazy to dig through the help).
> library(NADA)
> my.ex<-structure(list(TEC = c(0.21, 0.077, 0.06, 0.033, 0.014, 0.0072), LR =
+ c(0L, 0L, 1L, 0L, 1L, 0L)), .Names = c("TEC", "LR"), class = "data.frame",
+ row.names = c(NA, -6L))
>
> with(my.ex, cenfit(TEC,LR))
Error in function (classes, fdef, mtable) :
unable to find an inherited method for function ‘cenfit’ for
signature ‘"numeric", "integer", "missing"’
Not that I'm worried about it not working, but it's a good idea to
test reproducible examples on a clean session to ensure the best
possible answers.
Sarah
On Thu, Nov 15, 2012 at 9:32 AM, Martin Morgan <mtmorgan at fhcrc.org> wrote:
> On 11/15/2012 06:10 AM, Sarah Goslee wrote:
>>
>> Hi,
>>
>> Your reproducible example isn't reproducible for me, as I get an error
>> message.
>>
>> But regardless, the easiest thing to do is write your own wrapper,
>> something like:
>>
>> mycenfit <- function(x, y) {
>> result <- cenfit(x, y)
>> c(result, sum = result$n * result$mean)
>> }
>>
>> No need to change anything in the package itself. Incidentally, using
>> attach() is generally a really bad idea. with() is much safer.
>>
>> Sarah
>>
>> On Thu, Nov 15, 2012 at 7:00 AM, maxbre <mbressan at arpa.veneto.it> wrote:
>>>
>>> I want to get access to the code of an S4 method in order to possibly
>>> modify
>>> a function to accomplish my particular needs: in my case the function in
>>> is
>>> cenfit() from the package NADA
>>>
>>> Now, given my reproducible example:
>>>
>>> my.ex<-structure(list(TEC = c(0.21, 0.077, 0.06, 0.033, 0.014, 0.0072),
>>> LR =
>>> c(0L, 0L, 1L, 0L, 1L, 0L)), .Names = c("TEC", "LR"), class =
>>> "data.frame",
>>> row.names = c(NA, -6L))
>>>
>>> and the following few lines of code:
>>>
>>> library(“NADA)
>>>
>>> attach(my.ex)
>>>
>>> cenfit(TEC,LR)
>>>
>>> giving this output:
>>>
>>> n n.cen median mean sd
>>> 6.00 2.00 0.033 0.058 0.083
>
>
> actually, cenfit() returns an object
>
>> xx = cenfit(my.ex$TEC, as.logical(my.ex$LR))
>
> and what you're seeing is the result of the object's 'show' method
>
>> xx
> n n.cen median mean sd
> 6.00000000 2.00000000 0.03300000 0.05836667 0.08350178
>
> You can see the body of the show method with
>
> selectMethod(show, class(xx))
>
> and methods that are available to work on xx with
>
> showMethods(class=class(xx), where=search())
>
> Sarah is right that you'd likely want to write your own function, using a
> combination of available methods, e.g.,
>
> censtats <- function(x) {
> s = summary(x)
> c(n = nrow(s), n.cen = nrow(s) - sum(s$n.event), median = median(x),
> mean = mean(x)[["mean"]], sd = sd(x))
> }
>
> Martin
>
>>>
>>> I would like to add one more result to the above, namely “sum”, very
>>> simply
>>> computed as the product of “n” times “mean”
>>>
>>> Do you think that is possible or convenient?
>>>
>>> I’ve been reading that editing a S4 methods needs particular attention as
>>> by
>>> using showMethods("cenfit") and then getMethod("cenfit"); in fact, I’ve
>>> been
>>> trying that but without much success (i.e. understanding of the
>>> cumbersome
>>> output)
>>>
>>> can anyone give me some help on how is probably better to proceed in
>>> order
>>> to get my new result?
>>>
>>> different alternative solutions or hints or advices are also more than
>>> welcomed
>>> (I’m pretty new on R and specially on the field of function handling and
>>> customizing)
>>>
>>> all the best
>>>
>>> max
>>>
>>>
>>>
>>
>>
--
Sarah Goslee
http://www.functionaldiversity.org
More information about the R-help
mailing list