2015-06-22 14 views
5

Forse è qualcosa che ho semplicemente trascurato nella documentazione, ma come si può visualizzare un elenco di variabili attualmente definite in Julia? Ad esempio, in R è possibile utilizzare ls() che fornirà un elenco di oggetti definiti dall'utente nell'ambito corrente. C'è un equivalente in Julia?Visualizza le variabili definite dall'utente in Julia

Questo è molto simile a this question, ma sembra che la funzione whos (nonché names) elencano moduli e altre cose che non sono definito dall'utente. Come faccio semplicemente ad elencare le variabili che sono state definite dall'utente e non vengono esportate da altri moduli?

+0

@musically_ut: modificato per chiarire il mio intento. È leggermente diverso da quella domanda in quanto sto cercando di visualizzare _only_ variabili che sono state definite dall'utente piuttosto che esportate dai moduli. –

+0

Penso che tu abbia seguito il comportamento in questa richiesta pull: https://github.com/JuliaLang/julia/pull/10108. Dovresti aggiungere il tuo feedback sull'API proposta e aiutarti a farsene unire! –

+1

@MattB .: Bello, grazie per l'avviso. Non ho accesso in scrittura, quindi non posso unire la richiesta di pull ma ho lasciato un commento. L'API è un po 'strano IMO chiaramente sono un fan della funzionalità. ;) –

risposta

3

Un possibile approccio è quello di fare una variante di whos che limita il sommario degli oggetti nel modulo corrente:

function whos_user(m::Module=current_module()) 
    for v in sort(names(m)) 
     s = string(v) 
     if isdefined(m, v) && summary(eval(m, v)) != "Module" && s != "whos_user" 
      println(s) 
     end 
    end 
end 

Poi se facciamo

x = 1 
y = "Julia" 
f(n) = n + 1 
whos_user() 

otteniamo

f 
x 
y 

Si potrebbe anche scrivere whos_user per restituire una matrice di simboli piuttosto che la stampa:

function whos_user(m::Module=current_module()) 
    v = sort(names(m)) 
    filter(i -> isdefined(m, i) && summary(eval(m, i)) != "Module" && string(i) != "whos_user", v) 
end 

Poi esegue lo stesso codice di prova di prima, otteniamo questo:

3-element Array{Symbol,1}: 
    :f 
    :x 
    :y 

Se non c'è modo migliore per farlo allora accetterò questa risposta.

1

Julia ha whos function, simile a MATLAB, per questa attività.

+0

Grazie per la risposta. C'è un modo per far sì che "whos" elenchino solo le variabili definite dall'utente piuttosto che tutti i moduli disponibili, ecc.? –

+1

Non è esattamente quello che stai cercando, ma supponendo che tu stia lavorando al REPL puoi provare 'whos (Main)', che elenca solo i nomi nel modulo Main. – spencerlyon2

+0

@ spencerlyon2: ci ho provato, ma elenca ancora tutti i moduli e tutto il resto. Ad esempio, su JuliaBox, 'whos (Main)' stampa 'Modulo ArrayViews, Base Module, ...' Si sta avvicinando però, dato che anche le variabili definite dall'utente saranno presenti. –

Problemi correlati