Hi Thibaut --
On 05/21/2010 08:34 AM, Jombart, Thibaut wrote:> Dear R developers,
>
> I am having a slightly weird issue with a S4 method defined in my package
adegenet 1.2-4, with R 2.11.0. As far as I know, the problem is new, and the
code implementing the method has not changed for more than a year and worked
well so far.
>
> The problem is the following. I define, in the package, a method
"[" for the S4 class 'genind'. The method's definition is:
> setMethod("[", signature(x="genind", i="ANY",
j="ANY", drop="ANY"), function(x, i, j, ..., loc=NULL,
treatOther=TRUE, drop=FALSE) {
> ... ## code of the function
> })
>
> When sourcing the code directly from R, this method is found and used
normally. However, when loading the package, the method does not seem to be
"found" any longer by the dispatcher. For instance, here is an error I
get:
> ### R code
>> library(adegenet)
>> data(nancycats) # nancycat is a S4 object with class 'genind'
>> class(nancycats)
> [1] "genind"
> attr(,"package")
> [1] "adegenet"
>> nancycats[1]
> Error in nancycats[1] : object of type 'S4' is not subsettable #
"[" IS NOT USED HERE
> ### end R code
For what it's worth, I can't reproduce this problem, and in a new R
session after library(adegenet) I have
> sessionInfo()
R version 2.11.0 Patched (2010-05-01 r51886)
x86_64-unknown-linux-gnu
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=C LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 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 datasets utils methods base
other attached packages:
[1] adegenet_1.2-4 MASS_7.3-5
which has a different set of attached / loaded packages -- maybe you are
picking up something from .RData or .Rprofile, and you need to start R
with --vanilla?
Martin
>
> And still, the method is defined in the environment:
> ### R code
>> showMethods("[", class="genind")
> Function: [ (package base)
> x="genind"
>
>> findMethods("[", classes="genind")$genind
> Method Definition:
>
> function (x, i, j, ..., drop = FALSE)
> {
> .local <- function (x, i, j, ..., loc = NULL, treatOther = TRUE,
> drop = FALSE)
> {
> if (missing(i))
> i <- TRUE
> if (missing(j))
> j <- TRUE
> pop <- NULL
>
> ... # rest of the code of the function
> ### end R code
>
> findMethods and showMethods find the method. However, getMethod
doesn't:
> ### R code
>> getMethod("[","genind")
> Error in getMethod("[", "genind") :
> No method found for function "[" and signature genind
> ### end R code
>
> Now, if I just try the same thing after sourcing the code of the method
manually, everything works fine. showMethods then reads:
> ### R code
>> showMethods("[", classes="genind")
> Function: [ (package base)
> x="genind"
> x="genind", i="ANY", j="ANY",
drop="ANY"
> x="genind", i="numeric", j="missing",
drop="missing"
> (inherited from: x="genind", i="ANY",
j="ANY", drop="ANY")
> ### end R code
>
> My R version/session is:
> ### R code
>> R.version
> _
> platform i686-pc-linux-gnu
> arch i686
> os linux-gnu
> system i686, linux-gnu
> status
> major 2
> minor 11.0
> year 2010
> month 04
> day 22
> svn rev 51801
> language R
> version.string R version 2.11.0 (2010-04-22)
>
>> sessionInfo()
> R version 2.11.0 (2010-04-22)
> i686-pc-linux-gnu
>
> locale:
> [1] LC_CTYPE=en_GB.utf8 LC_NUMERIC=C
> [3] LC_TIME=en_GB.utf8 LC_COLLATE=en_GB.utf8
> [5] LC_MONETARY=C LC_MESSAGES=en_GB.utf8
> [7] LC_PAPER=en_GB.utf8 LC_NAME=C
> [9] LC_ADDRESS=C LC_TELEPHONE=C
> [11] LC_MEASUREMENT=en_GB.utf8 LC_IDENTIFICATION=C
>
> attached base packages:
> [1] stats graphics grDevices utils datasets methods base
>
> other attached packages:
> [1] adegenet_1.2-4 MASS_7.3-5
>
> loaded via a namespace (and not attached):
> [1] graph_1.26.0 phylobase_0.5 tcltk_2.11.0 tools_2.11.0
>
> ### end R code
>
> R was compiled from the sources. All packages are up-to-date (as of the 21
May 2010). My system is a Ubuntu 10.04 (32 bits), with kernel 2.6.31-20-generic.
I could not reproduce the problem using R 2.11.0 on Windows Vista, or on Debian
testing (R 2.11.0 compiled from the sources). The package adegenet does not have
a namespace. The error arises whether using a field 'Collate' in
DESCRIPTION, or not. I checked that the source file is indeed sourced when
loading the package: it is. The method "[" is not defined by any other
package for 'genind' objects.
>
> I would be pleased to get any piece of insight, advice, or explanation for
this issue. Thanks in advance for your time.
>
> Best regards,
>
> Thibaut Jombart.
>
>
--
Martin Morgan
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