Search code examples
juliapluto.jlundefvarerror

Julia throws undefined error when the variable is defined


I have this simple while loop that uses i = 1 as an index.

global i = 1 
    
    n = rows
    while i <= n
        if prod(isa.(collect((y)[i,:]),Number))==0
            delete!(y,i)
            x_axis = x_axis[1:end .!= i]
            n -= 1
        end
        i += 1
    end

but I'm getting this error:

UndefVarError: i not defined

top-level scope@Local: 23

I even made my i global as per the suggestion on some similar questions on SO but the error persists. I am running this on Pluto.jl so maybe it could be an environment issue.


Solution

  • Firstly, note that if you use Julia v1.5+ then you don't need to make i a global (example below with current stable version v1.5.4):

    julia> i = 1
    1
    
    julia> while i < 5
               println(i)
               i += 1     # <----- this works in Julia v1.5+
           end
    1
    2
    3
    4
    

    However, it seems you are using Julia v1.4 of older, in which case I think Logan Kilpatrick gave you the answer: You need to make i a global from inside the while loop's scope. As Logan mentioned, try adding global where you increment i, like in this example from the while function's docs:

    julia> i = 1 ;
    
    julia> while i < 5
               println(i)
               global i += 1     # <------------ Try this!
           end
    1
    2
    3
    4
    

    Note also that you don't need to specify it's a global if your while loop is inside a function, as in

    julia> function foo(istart)
               i = istart
               while i < 5
                   println(i)
                   i += 1     # <-- 'global' not needed inside a function!
               end
           end
    foo (generic function with 1 method)
    
    julia> foo(1)
    1
    2
    3
    4