[Rd] Signature of '!' (was Problem with R-2.5.0 patched and Matrix package)

Prof Brian Ripley ripley at stats.ox.ac.uk
Mon Apr 30 12:52:23 CEST 2007


I think I have a workaround for this in R-devel now, but obviously it will 
be better to change Matrix in due course.

I believe this requires Matrix to be re-installed (again) under R-devel.


On Sat, 28 Apr 2007, Martin Maechler wrote:

>>>>>> "BDR" == Prof Brian Ripley <ripley at stats.ox.ac.uk>
>>>>>>     on Thu, 26 Apr 2007 22:57:11 +0100 (BST) writes:
>
>    BDR> Yes, it works in the release.  The essence of the
>    BDR> problem is that Matrix defines an S4 method for '!'
>    BDR> with dispatch on 'e1', but the documentation for '!'
>    BDR> (and many S3 methods) says the argument is 'x'.  As '!'
>    BDR> is a primitive the argument matching of the base
>    BDR> function might be expected to be positional only, but
>    BDR> that is not what happens with methods.
>
>    BDR> This needs some juggling, and clearly two patches in
>    BDR> R-patched have conflicted.  I've reverted one of them
>    BDR> and this seems to work again (but something else no
>    BDR> longer works: see below).
>
>    BDR> Longer term, I don't know what the right way forward
>    BDR> is.  Consider
>
>    >> setClass("foo", "logical")
>    BDR> [1] "foo"
>    >> setMethod("!", "foo", function(e1) NA)
>    BDR> [1] "!"
>    >> x <- new("foo", TRUE) !x
>    BDR> [1] NA
>    >> `!`(x)
>    BDR> [1] NA
>    >> `!`(x=x)
>    BDR> Error in !x : unused argument(s) (x = TRUE)
>    >> `!`(e1=x)
>    BDR> [1] NA
>
>    BDR> which is not what the reader of the help for '!' might
>    BDR> expect.  But it gets worse:
>
>    >> x2 <- structure(TRUE, class="bar") `!.bar` <- function(x)
>    >> NA
>    BDR> (and there are several S3 methods like that in CRAN
>    BDR> packages)
>    >> !x2
>    BDR> [1] NA
>    >> `!`(x2)
>    BDR> [1] NA
>    >> `!`(x=x2)
>    BDR> Error in !x2 : unused argument(s) (x = TRUE)
>    >> `!`(e1=x2)
>    BDR> Error in `!.bar`(e1 = x2) : unused argument(s) (e1 =
>    BDR> TRUE)
>
>    BDR> whereas `!`(x=x2) does work if you do not set an S4
>    BDR> method on '!'.  This may seem artificial, but this sort
>    BDR> of thing can happen if you use operators as functions
>    BDR> in lapply().
>
>    BDR> Since there are in packages S3 methods on 'x' and S4
>    BDR> methods on 'e1', we have a conflict.
>
>    BDR> My gut feeling is that the inconsistency is the S4
>    BDR> signature, and certainly that seems the easier one to
>    BDR> change.  I knew about this because the
>    BDR> behind-the-scenes S4 generics in R-devel are
>    BDR> auto-generated from the descriptions of the primitives.
>    BDR> Now in 2.5.0 you will see
>
>    >> `!`
>    BDR> function (x) .Primitive("!")
>
>    BDR> and hence there needed to be an exclusion list (which
>    BDR> now includes '!' and 'c') to have Matrix work in
>    BDR> R-devel.  An alternative is to make the internal method
>    BDR> dispatch on operators ignore the argument names.
>
>    BDR> (I can guess where this comes from.  '!' is a member of
>    BDR> the S3 Ops group, and as part of a group method you
>    BDR> define Ops(e1, e2) and ignore e2.  But '!' is not part
>    BDR> of the S4 group generic Logic in R.)
>
> Yes, indeed (and that was made so very consciously after
> discussion between John and me (and maybe more people)) in
> order to at least keep the signature precise for the (S4)Logic group.
>
> I agree with you (Brian) that the inconsistency between
> '(x)' and '(e1)' is ugly and I agree that we
> make the signature into  '(x)' and we (I) have to change Matrix
> subsequently.
> If possible (easily enough), we should try to keep 'e1' working
> in  setMethod("!", .)  with a deprecation warning
>
> Martin
>
>
>    BDR> On Thu, 26 Apr 2007, Seth Falcon wrote:
>
>    >> Hi,
>    >>
>    >> Using latest R 2.5.0 Patched, I'm unable to install the
>    >> Matrix package from cran.fhcrc.org.
>    >>
>    >> I get:
>    >>
>    >> Creating a new generic function for "isSymmetric" in
>    >> "Matrix" Creating a new generic function for "unname" in
>    >> "Matrix" Error in conformMethod(signature, mnames,
>    >> fnames, f) : In method for function "!": formal arguments
>    >> omitted in the method definition cannot be in the
>    >> signature (x = "Matrix") Error: unable to load R code in
>    >> package 'Matrix' Execution halted ERROR: lazy loading
>    >> failed for package 'Matrix' ** Removing
>    >> '/home/sfalcon/RLIBS/2.5/Matrix' ** Restoring previous
>    >> '/home/sfalcon/RLIBS/2.5/Matrix'
>    >>
>    >> The downloaded packages are in
>    >> /tmp/RtmpcEQJjw/downloaded_packages Warning message:
>    >> installation of package 'Matrix' had non-zero exit status
>    >> in: install.packages(pkgs = pkgs, repos = repos,
>    >> dependencies = dependencies,
>    >>
>    >> I don't have this problem when using a recent R-devel.
>    >> And I'm guessing that Matrix works with the release, but
>    >> haven't had time to check this.
>    >>
>    >> + seth
>    >>
>    >>
>
>    BDR> -- Brian D. Ripley, ripley at stats.ox.ac.uk Professor of
>    BDR> Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
>    BDR> University of Oxford, Tel: +44 1865 272861 (self) 1
>    BDR> South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG,
>    BDR> UK Fax: +44 1865 272595
>
>    BDR> ______________________________________________
>    BDR> R-devel at r-project.org mailing list
>    BDR> https://stat.ethz.ch/mailman/listinfo/r-devel
>

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595



More information about the R-devel mailing list