[Rd] Defining an iterator
Stavros Macrakis
macrakis at alum.mit.edu
Sun Jan 25 22:09:19 CET 2009
Inspired by Rudolf Biczok's query of Fri, Jan 23, 2009 at 1:25 AM, I
tried to implement iteration in a generic way using S4. (Though I am
admittedly still struggling with learning S4.)
> setClass("foo",representation(bar="list"))
[1] "foo"
> x<-new("foo",bar=list(1,2,3))
Given this, I would not expect for(i in x)... to work, since R has no
way of knowing that x at bar should be used as is. What would it do if
the representation included two lists? What if list(1,2,3) is used by
the class foo to represent something else?
But I did hope that I could put in place some definitions so that the
*class* could define an iterator.
First I tried overloading `for` to allow the definition of iterator
classes, but as a primitive function, `for` cannot be overloaded.
Then I tried to see how the Containers package handles iterators:
> library(Containers);.jinit();.jpackage("Containers")
> ah = MaxHeap(); ah$insert(3)
> for (i in ah) print(i)
[1] NA
> as.list(ah)
[[1]]
[1] NA
Bit it appears that the Containers package's Iterators don't interface
with R's `for` or type conversion system.
So I gave up on iterators, but thought I'd try automatic conversion to lists.
So I defined an automatic conversion from foo to list, since `for`'s
seq argument is specified as "An expression evaluating to a vector
(including a list...)":
setAs("foo","list",function(from)from at bar)
This and various variants (using "numeric" or "vector" instead of
"list") all give errors. Is there perhaps some 'sequence' superclass
that I am ignorant of?
I *was* able to overload lapply:
> setMethod("lapply","foo",function(X,FUN,...) lapply(X at bar,FUN,...))
> lapply(x,dput); NULL
1
2
3
NULL
but of course that doesn't affect `for` and other places that expect sequences.
Is there in fact some generic way to handle define iterators or
abstract sequences in R?
-s
More information about the R-devel
mailing list