From ripley at stats.ox.ac.uk  Mon Sep  4 11:49:33 2006
From: ripley at stats.ox.ac.uk (Prof Brian Ripley)
Date: Mon, 4 Sep 2006 10:49:33 +0100 (BST)
Subject: [Rd] setMethod("Logic", ...)
In-Reply-To: <7F7440CD-18B2-4AB6-B0BA-6DB0B0491727@soc.soton.ac.uk>
References: <91AD8AFC-E5A3-4F79-821D-CACC2705333D@soc.soton.ac.uk>
	<Pine.LNX.4.64.0609011642240.16133@gannet.stats.ox.ac.uk>
	<7F7440CD-18B2-4AB6-B0BA-6DB0B0491727@soc.soton.ac.uk>
Message-ID: <Pine.LNX.4.64.0609041043490.20222@gannet.stats.ox.ac.uk>

On Mon, 4 Sep 2006, Robin Hankin wrote:

> Professor Ripley
> 
> thank you for this (and indeed thank you for solving my earlier
> problem on octonions).
> 
> I still don't know how  to force logic operations on brob objects to give an
> error.

I found this in the methods sources

    ## R does not currently do the Logic group (! & |)
    ## A strange group, since the argument lists are different.  But
    ## perhaps we'll add it sometime.

(Not sure about the comment: there are unary and binary operators in 
Arith.)

It looks to me as if you can work around this by defining S3 methods for 
the class, if that is all you want to do.

setClass("foo", representation="numeric")
x <- new("foo", pi)
> !x
[1] FALSE
> "!.foo" <- function(x) stop("not supported")
> !x
Error in "!.foo"(x) : not supported



> 06, at 16:45, Prof Brian Ripley wrote:
> 
> >Accordng to the S4groupGeneric page, there is no such group.
> >
> >My guess as to why:
> >
> >Those operators are not S3 generic in R, and S4 dispatch is piggy-backed
> >on S3 dispatch (not necessarily, but for convenience).

I was wrong here.

> I have been trying to use the  example on p119 of S Programming as
> a template:
> 
> 
> setClass("brob",
>         representation = representation(x="numeric",positive="logical"),
>         prototype      = list(x=numeric(),positive=logical())
>         )
> 
> 
> .logicBrob <- function(e1,e2){
>  stop("No logic currently implemented for Brobdingnagian numbers")
> }
> 
> 
> setMethod("Logic",signature(e1="brob"), .logicBrob)
> setMethod("Logic",signature(e2="brob"), .logicBrob)
> 
> 
> 
> but this does not work as desired (setMethod() gives an error).  I want,
> for example,
> 
> !new("brob", x=1:10,positive=rep(T,10))
> 
> to call .logicBrob() and report an error.
> 
> 
> 
> 
> 
> --
> Robin Hankin
> Uncertainty Analyst
> National Oceanography Centre, Southampton
> European Way, Southampton SO14 3ZH, UK
> tel  023-8059-7743
> 

-- 
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




[Rd] setMethod("Logic", ...)
Prof Brian Ripley