Re: [Rd] histogram method for S4 class.

From: Ernesto Jardim <ernesto_at_ipimar.pt>
Date: Fri 26 Aug 2005 - 09:15:01 GMT

Deepayan Sarkar wrote:

>On 8/24/05, ernesto <ernesto@ipimar.pt> wrote:
>
>
>>Hi,
>>
>>I'm trying to develop an histogram method for a class called "FLQuant"
>>which is used by the package FLCore (http://flr-project.org). FLQuant is
>>an extension to "array". There is an as.data.frame method that coerces
>>flquant into a data.frame suitable for lattice plotting. The problem is
>>that when I coerce the object and plot it after it works but if the
>>method is applied within the histogram method it does not work. See the
>>code below (the FLCore package is here
>>http://prdownloads.sourceforge.net/flr/FLCore_1.0-1.tar.gz?download)
>>
>>
>>
>>>library(FLCore)
>>>
>>>
>>Loading required package: lattice
>>
>>
>>>data(ple4)
>>>histogram(~data|year, data=ple4@catch.n)
>>>
>>>
>>Error in inherits(x, "factor") : Object "x" not found
>>
>>
>>>histogram(~data|year, data=as.data.frame(ple4@catch.n))
>>>
>>>
>>The catch.n slot is a FLQuant object and the code for histogram is the
>>following
>>
>>setMethod("histogram", signature(formula="formula", data="FLQuant"),
>> function (formula, data = parent.frame(), allow.multiple =
>>is.null(groups) || outer,
>> outer = FALSE, auto.key = FALSE, aspect = "fill", panel =
>>"panel.histogram", prepanel = NULL,
>> scales = list(), strip = TRUE, groups = NULL, xlab, xlim, ylab,
>>ylim,
>> type = c("percent", "count", "density"),
>> nint = if (is.factor(x)) length(levels(x)) else
>>round(log2(length(x)) + 1),
>> endpoints = extend.limits(range(x[!is.na(x)]), prop = 0.04),
>> breaks = if (is.factor(x)) seq(0.5, length = length(levels(x)) +
>>1) else do.breaks(endpoints, nint),
>> equal.widths = TRUE, drop.unused.levels =
>>lattice.getOption("drop.unused.levels"), ...,
>> default.scales = list(), subscripts = !is.null(groups), subset =
>>TRUE) {
>>
>> qdf <- as.data.frame(data)
>>
>> histogram(formula, data = qdf, allow.multiple = allow.multiple,
>>outer = outer,
>> auto.key = auto.key, aspect = aspect, panel = panel,
>>prepanel = prepanel, scales = scales,
>> strip = strip, groups = groups, xlab=xlab, xlim=xlim,
>>ylab=ylab, ylim=ylim, type = type,
>> nint = nint, endpoints = endpoints, breaks = breaks,
>>equal.widths = equal.widths,
>> drop.unused.levels = drop.unused.levels, ..., default.scales
>>= default.scales,
>> subscripts = subscripts, subset = subset)
>> }
>>)
>>
>>
>>Any ideas ?
>>
>>
>
>[I'm CC-ing to r-devel, please post follow-ups there]
>
>What version of lattice are you using? Please use the latest one, in
>which histogram is an S3 generic, with only one argument, formula. The
>eventual solution to your problem may involve changing that, but the
>first question to ask is whether any other formula makes sense in your
>context (if not, I would rather keep one argument and dispatch on
>signature(formula = "FLQuant").
>
>Disclaimer: I haven't actually had time to check out FLCore yet, I
>will as soon as I can.
>
>Deepayan
>
>
Hi,

I've installed the version that is distributed with R-2.1.1, 0.11-8. I see there's a new version now so I'll install it and check the results. I've developed the code a little more using the approach you use for dotplot (see below) and I know where the problem is now. I'm not able to pass the argument nint, breaks and endpoints to the function call. I guess the problem is my programming skils :-(

Thanks

EJ

ps: I'm not a subscriber of r-devel so I guess I'm not able to post there, anyway I'm CC-ing there too.

setMethod("histogram", signature(formula="formula", data="FLQuant"), function (formula, data = parent.frame(), allow.multiple = is.null(groups) || outer, outer = FALSE, auto.key = FALSE, aspect = "fill", panel = "panel.histogram", prepanel = NULL, scales = list(), strip = TRUE, groups = NULL, xlab, xlim, ylab, ylim, type = c("percent", "count", "density"), nint = if (is.factor(x)) length(levels(x)) else round(log2(length(x)) + 1), endpoints = extend.limits(range(x[!is.na(x)]), prop = 0.04), breaks = if (is.factor(x)) seq(0.5, length = length(levels(x)) + 1) else do.breaks(endpoints, nint), equal.widths = TRUE, drop.unused.levels = lattice.getOption("drop.unused.levels"), ..., default.scales = list(), subscripts = !is.null(groups), subset = TRUE) {

# need to develop further, at the moment is not possible to control nint, breaks and endpoints.

data <- as.data.frame(data)

dots <- list(...)

groups <- eval(substitute(groups), data, parent.frame()) subset <- eval(substitute(subset), data, parent.frame())

call.list <- c(list(formula = formula, data = data, groups = groups, subset = subset, allow.multiple = allow.multiple, outer = outer, auto.key = auto.key, aspect = aspect, panel = panel, prepanel = prepanel, scales = scales, strip = strip, type = type, equal.widths = equal.widths, drop.unused.levels = drop.unused.levels, default.scales = default.scales, subscripts = subscripts), dots)

# include xlab & co if existent

if(!missing(xlab)) call.list$xlab <- xlab
if(!missing(ylab)) call.list$ylab <- ylab
if(!missing(xlim)) call.list$xlim <- xlim
if(!missing(ylim)) call.list$ylim <- ylim

ans <- do.call("histogram", call.list)
ans$call <- match.call()
ans

})



R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Fri Aug 26 19:16:02 2005

This archive was generated by hypermail 2.1.8 : Mon 20 Feb 2006 - 03:21:19 GMT