Skip to content

using with inside loop breaks next

2 messages · Richard Cotton, Peter Dalgaard

#
If I want to use with inside a loop, it seems that next gets confused.
To reproduce:

for(lst in list(list(a = 1), list(a = 2), list(a = 3)))
{
  with(lst, if(a == 2) next else print(a))
}

I expect 1 and 3 to be printed, but I see

[1] 1
 Error in eval(expr, envir, enclos) :
  no loop for break/next, jumping to top level

Is this
a) by design, or
b) a bug, or
c) a thing that is rare enough that I should just rewrite my code?
#
(a)/(c) mostly, I think. The crux is that "next" is unhappy about being evaluated in a different environment than the containing loop. Witness this:
[1] 1
[1] 2
[1] 3
[1] 4
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 1
[1] 2
[1] 3
[1] 4
Error in eval(substitute(expr), envir, enclos) : 
  no loop for break/next, jumping to top level
[1] 1
[1] 2
[1] 3
[1] 4
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10

-pd