2012-01-06 9 views
7

Siamo in grado di creare un monitoraggio in tempo reale di una variabile in questo modo:.Creazione robusti monitor in tempo reale per le variabili

[email protected]@Row[{"x = ", Dynamic[x]}] 

(Questo è più interessante e utile se x sembra essere qualcosa di simile a $Assumptions E 'così facile impostare un valore e poi dimenticarlo)

Sfortunatamente questo smette di funzionare se il kernel viene rilanciato (Quit[], quindi valutare qualcosa). La tavolozza non mostrerà più le modifiche nel valore di x.

C'è un modo per farlo in modo che continui a funzionare anche attraverso le sessioni del kernel? Mi trovo a riavviare il kernel abbastanza spesso. (Se la palette risultante fa sì che il kernel da avviare automaticamente dopo Quit va bene.)


Aggiornamento: Come accennato nei commenti, si scopre che la tavolozza cessa di lavoro solo se abbiamo smesso valutando Quit[] . Quando si utilizza Evaluation -> Quit Kernel -> Local, continuerà a funzionare.


+0

Il tutorial Mma su [Memorizzazione e monitoraggio Palette Uniti] (http://reference.wolfram.com/mathematica/tutorial/StoringAndTrackingPaletteStates.html) discute alcuni metodi che dovrebbero essere utili. – kglr

+0

@kguler L'ho già visto in precedenza, ma se ricordo bene, si tratta solo di memorizzare lo stato tra una sessione e l'altra (ad esempio 'DynamicModule'). Questo non è quello di cui ho bisogno. Si noti che il codice del programma (non stato) rimane lo stesso tra le sessioni e il monitor della variabile I è hardcoded. Tuttavia, dopo un riavvio del kernel, smette di funzionare, sia perché non si aggiorna dinamicamente, sia perché il '' $ CellContext' '' before 'x' nella tavolozza crea problemi (solo un'ipotesi, non ho potuto verificare o correggere questo – Szabolcs

+3

Si noti che, se si chiude il kernel dal menu a discesa, Evauation-> Esci da kernel -> Locale, la tavolozza funzionerà ancora dopo aver avviato una nuova sessione. –

risposta

3

posso solo immaginare, perché sul mio Ubuntu qui le situazioni sembra buggy. Il trucco con il tasto Esci dal menu come suggerito da Leonid non ha funzionato qui. Un altro è: in una nuova sessione Mathematica con un solo taccuino aperto:

Dynamic[x] 
x = 1 
Dynamic[x] 
x = 2 

dà come previsto

2 
1 
2 
2 

Digitando nella riga successiva Quit, valutazione e digitando poi x=3 aggiornamenti solo il primo dei dinamico [x].

Tuttavia, Hai controllato il comando

Internal`GetTrackedSymbols[] 

Questo dà non solo i simboli tracciati ma in aggiunta una sorta di ID in cui il contenuto dinamico appartiene. Se riesci a scoprire quali sono esattamente questi numeri e ad investigare nelle altre funzioni che trovi nel contesto Interno, potresti essere in grado di aggiungere manualmente la tua tavolozza di contenuto dinamico dopo aver riavviato il kernel.

ho pensato che avevo qualcosa di simile con

Internal`SetValueTrackExtra 

ma non sono attualmente in grado di riprodurre il comportamento.

+0

Altri risultati interessanti. Posso riprodurre le tue scoperte sul secondo 'Dynamic' non aggiornando, nemmeno quando uso il comando menu per uscire. – Szabolcs

+0

È interessante notare che ci vogliono due 'Quit []' s o due invocazioni di 'Esci da Kernel-Local' nel menu' Valutazione 'per cancellare entrambe le espressioni dinamiche al valore 'x'. Quindi, digitando 'x = 3' aggiorna entrambi. – kglr

+0

Ancora più divertente, ci vogliono tanti 'Quit []' s come il numero di 'Dynamic [x]' s in tutti i quaderni aperti per cancellare tutti al valore 'x'. – kglr

3

@ risposta di halirutan urtato la mia memoria ...

Avete mai incontrato: Experimental/ref/ValueFunction?(Indirizzo documentazione)

Anche se la documentazione non contiene esempi, la sezione 'ulteriori informazioni' fornisce i seguenti bocconcino:

L'assegnazione ValueFunction[symb] = f specifica che ogni volta symb ottiene un nuovo valore val, l'espressione f[symb,val] dovrebbe essere valutato .

+0

Scoperta interessante! Non risolve il problema con il riavvio del kernel, e l'aggiornamento dell'arresto dinamico (se trovi una soluzione per questo usando questa funzione, per favore fammelo sapere!), Ma sicuramente vale la pena menzionarlo! – Szabolcs