[R] Trouble with methods() after loading gdata package.
Achim Zeileis
Achim.Zeileis at uibk.ac.at
Wed May 1 10:20:48 CEST 2013
On Tue, 30 Apr 2013, Paul Johnson wrote:
> Greetings to r-help land.
>
> I've run into some program crashes and I've traced them back to
> methods() behavior after the package gdata is loaded. I provide now a
> minimal re-producible example. This seems bugish to me. How about you?
>
> dat <- data.frame(x = rnorm(100), y = rnorm(100))
> lm1 <- lm(y ~ x, data = dat)
The two lines above are not really needed. It's just the behaviour of
methods(class = "lm") before and after loading gdata:
> methods(class = "lm")
>
> ## OK so far
>
> library(gdata)
> methods(class = "lm")
> ## epic fail
The reason is that nobs.lm is found twice by methods(): first in "stats"
and then in "gdata". And because methods() builds a data.frame with row
names corresponding to all methods, this gives an error because row names
in data frames have to be unique.
I guess it would be good to safeguard the methods function against
situations like this. If methods are found more than once, one could run
unqiue() on it or alternatively keep the duplicates but add the
information about which namespace it is coming from.
Additionally, it would probably be good if "gdata" changed its current
behavior of copying the nobs generic and nobs.lm method. gdata does
this so that it can provide a modified nobs.default and nobs.data.frame
built on top of the nobs.default. But the price is that all the other
methods registered with the stats::nobs generic are not found anymore
R> methods(nobs)
[1] nobs.default* nobs.glm* nobs.lm* nobs.logLik* nobs.nls*
... and after loading gdata ...
R> methods(nobs)
[1] nobs.data.frame* nobs.default* nobs.lm*
Hence the glm/logLik/nls methods are only found if the user explicitly
calls stats::nobs. An artificially constructed example is
R> m <- lm(dist ~ speed, data = cars)
R> nobs(logLik(m))
[1] 1
R> stats:::nobs(logLik(m))
[1] 50
I haven't checked how much use gdata makes of the modified nobs.default
outside nobs.data.frame. If this isn't used in other crucial places, I
would probably recommend to omit nobs/nobs.default/nobs.lm from the gdata
namespace and just register nobs.data.frame with stats::nobs.
>
>
> ## OUTPUT.
>
>> dat <- data.frame(x = rnorm(100), y = rnorm(100))
>> lm1 <- lm(y ~ x, data = dat)
>>
>> methods(class = "lm")
> [1] add1.lm* alias.lm* anova.lm case.names.lm*
> [5] confint.lm* cooks.distance.lm* deviance.lm* dfbeta.lm*
> [9] dfbetas.lm* drop1.lm* dummy.coef.lm* effects.lm*
> [13] extractAIC.lm* family.lm* formula.lm* hatvalues.lm
> [17] influence.lm* kappa.lm labels.lm* logLik.lm*
> [21] model.frame.lm model.matrix.lm nobs.lm* plot.lm
> [25] predict.lm print.lm proj.lm* qr.lm*
> [29] residuals.lm rstandard.lm rstudent.lm simulate.lm*
> [33] summary.lm variable.names.lm* vcov.lm*
>
> Non-visible functions are asterisked
>>
>> library(gdata)
> gdata: read.xls support for 'XLS' (Excel 97-2004) files ENABLED.
>
> gdata: read.xls support for 'XLSX' (Excel 2007+) files ENABLED.
>
> Attaching package: ?gdata?
>
> The following object is masked from ?package:stats?:
>
> nobs
>
> The following object is masked from ?package:utils?:
>
> object.size
>
>> methods(class = "lm")
> Error in data.frame(visible = rep.int(FALSE, n2), from = rep.int(msg, :
> duplicate row.names: nobs.lm
>
>> sessionInfo()
> R version 3.0.0 (2013-04-03)
> Platform: x86_64-pc-linux-gnu (64-bit)
>
> 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=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
> [7] LC_PAPER=C 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] gdata_2.12.0.2
>
> loaded via a namespace (and not attached):
> [1] gtools_2.7.1 tcltk_3.0.0 tools_3.0.0
>
>
> gdata is one of my favorite packages, its worth the effort to get to the
> bottom of this.
>
> --
> Paul E. Johnson
> Professor, Political Science Assoc. Director
> 1541 Lilac Lane, Room 504 Center for Research Methods
> University of Kansas University of Kansas
> http://pj.freefaculty.org http://quant.ku.edu
>
> [[alternative HTML version deleted]]
>
>
More information about the R-help
mailing list