1. I'm not sure I see the need for the syntax change. Couldn't this all
be done in a while or repeat loop? E.g. your example could keep the
same definition of SampleSequence, then
iterator <- SampleSequence(2)
repeat {
sample <- iterator()
if (is.null(sample)) break
print(sample)
}
Not as simple as yours, but I think a little clearer because it's more
concrete, less abstract.
2. It's not clear to me how the for() loop chooses a value to pass to
the iterator function. (Sorry, I couldn't figure it out from your
patch.) Is "exhausted" a unique value produced each time for() is
called? Is it guaranteed to be unique? What does a user see if they
look at it?
Duncan Murdoch
On 2025-08-11 3:23 p.m., Tomasz Kalinowski wrote:
Hi all,
A while back, Hadley and I explored what an iteration protocol for R
might look like. We worked through motivations, design choices, and edge
cases, which we documented here:
https://github.com/t-kalinowski/r-iterator-ideas
At the end of this process, I put together a patch to R (with tests) and
would like to invite feedback from R Core and the broader community:
https://github.com/r-devel/r-svn/pull/130/files?diff=unified&w=1
In summary, the overall design is a minimal patch. It introduces no
breaking changes and essentially no new overhead. There are two parts.
1. Add a new `as.iterable()` S3 generic, with a default identity
method. This provides a user-extensible mechanism for selectively
changing the iteration behavior for some object types passed to
`for`. `as.iterable()` methods are expected to return anything that
`for` can handle directly, namely, vectors or pairlists, or (new) a
closure.
2. `for` gains the ability to accept a closure for the iterable
argument. A closure is called repeatedly for each loop iteration
until the closure returns an `exhausted` sentinel value, which it
received as an input argument.
Here is a small example of using the iteration protocol to implement a
sequence of random samples:
``` r
SampleSequence <- function(n) {
i <- 0
function(done = NULL) {
if (i >= n) {
return(done)
}
i <<- i + 1
runif(1)
}
}
for(sample in SampleSequence(2)) {
print(sample)
}
# [1] 0.7677586
# [1] 0.355592
```
Best,
Tomasz
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel