[R] Help with R.oo
Henrik Bengtsson
hb at stat.berkeley.edu
Sat Jul 18 03:23:33 CEST 2009
On Sat, Jul 18, 2009 at 3:21 AM, Henrik Bengtsson<hb at stat.berkeley.edu> wrote:
> On Fri, Jul 17, 2009 at 11:41 PM, Jim Nemesh<nemesh at broad.mit.edu> wrote:
>> Hi! I'm trying to learn about object oriented R, as it seems like it
>> would be very useful.
>>
>> I'm going over an example from the documentation, and I'm very confused:
>>
>> http://www1.maths.lth.se/help/R/R.oo/
>>
>> [assume you've called library (R.oo)]
>>
>> setConstructorS3("SavingsAccount", function(balance=0) {
>> if (!is.numeric(balance) && length(balance) != 1)
>> throw("Argument 'balance' must be a single numeric value: ",
>> mode(balance));
>> if (balance < 0)
>> throw("Trying to create an account with a negative balance.");
>>
>> extend(Object(), "SavingsAccount",
>> .balance = balance
>> );
>> })
>>
>> Why would I get the following result?
>>
>> > SavingsAccount(5)
>> [1] "SavingsAccount: 0x18706032"
>> > SavingsAccount("fruit")
>> [1] "SavingsAccount: 0x605387128"
>>
>> The second time, the input should fail, balance is not numeric.
>
> Nope, because:
>
>> balance <- "fruit"
>> (!is.numeric(balance) && length(balance) != 1)
> [1] FALSE
...and shame on me - that was my own example code, which should be:
(!is.numeric(balance) || length(balance) != 1)
to work as expected.
/H
>> (balance < 0)
> [1] FALSE
>
>
>>
>> ------------------------------
>>
>> A second attempt, with my own code:
>>
>> setConstructorS3("StreamingFileReader", function(fileName,
>> hasHeader=T, sep="\t") {
>> if (missing (fileName)) throw ("Must supply a file name!");
>> if (missing(hasHeader)) hasHeader <-T;
>> if (missing(sep)) sep="\t";
>>
>> extend(Object(), "StreamingFileReader",
>> .fileName=fileName,
>> .hasHeader=hasHeader,
>> .sep=sep);
>> })
>>
>> > z= StreamingFileReader("temp")
>> Error in list(`StreamingFileReader("temp")` = <environment>,
>> `extend(Object(), "StreamingFileReader", .fileName =
>> fileName, .hasHeader = hasHeader, .sep = sep)` = <environment>, :
>>
>> [2009-07-17 17:37:15] Exception: Must supply a file name!
>> at throw(Exception(...))
>> at throw.default("Must supply a file name!")
>> at throw("Must supply a file name!")
>> at constructor()
>> at getStaticInstance.Class(class)
>> at getStaticInstance(class)
>> at getStaticInstance.Object(this)
>> at getStaticInstance(this)
>> at extend.Object(Object(), "StreamingFileReader", .fileName =
>> fileName, .hasHeader = hasHeader, .sep =
>> at extend(Object(), "StreamingFileReader", .fileName =
>> fileName, .hasHeader = hasHeader, .sep = sep)
>> at StreamingFileReader("temp")
>> > z= StreamingFileReader("temp")
>> > z$.fileName
>> [1] "temp"
>>
>> Why is it that the first time I try to construct the object it fails,
>> and the second time it seems to work just fine? Is there something I
>> should be doing between declaring the constructor and using the object
>> (besides adding S3 methods?)
>
> From help(setConstructorS3): "Note: The constructor must be able to be
> called with no arguments, i.e. use default values for all arguments or
> make sure you use missing() or similar! ...".
>
> In your case you must design your constructor function so that you can
> call it without arguments, e.g. StreamingFileReader(). The reason for
> this is that a *static* instance of the class is always created
> automatically by calling the constructor with empty arguments. This
> static instance is create the first time the constructor is called in
> your code, but not the following times. This is why you only get the
> error the first time, but not in subsequent calls. This "feature" is
> by design of R.oo/setConstructorS3() - too long explanation/take my
> word on it.
>
> There should be no more surprises after this one (few people ever discover it).
>
> /Henrik
>
>>
>> Thanks for any help, I find this entirely confusing.
>>
>> -Jim Nemesh
>>
>>
>>
>>
>> [[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-help at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>
>
More information about the R-help
mailing list