2012-01-06 9 views
7

Podemos crear un monitor en tiempo real de una variable de la siguiente manera:.Creación de monitores en tiempo real robustos para las variables

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

(Esto es más interesante y útil si x pasa a ser algo así como $Assumptions es tan fácil de establecer un valor y luego olvidarse de él.)

Desafortunadamente, esto deja de funcionar si se reinicia el kernel (Quit[], luego se evalúa algo). La paleta ya no mostrará cambios en el valor x.

¿Hay alguna manera de hacer esto para que siga funcionando incluso en las sesiones del kernel? Me encuentro reiniciando el kernel con bastante frecuencia. (Si la paleta resultante hace que el núcleo se inicia automáticamente después de Quit que está bien.)


Actualización: Como se mencionó en los comentarios, resulta que la paleta deja de trabajar sólo si dejamos evaluando Quit[] . Al usar Evaluation -> Quit Kernel -> Local, seguirá funcionando.


+0

El tutorial de Mma sobre [Almacenar y rastrear estados de paleta] (http://reference.wolfram.com/mathematica/tutorial/StoringAndTrackingPaletteStates.html) describe algunos métodos que deberían ser útiles. – kglr

+0

@kguler Lo he visto anteriormente, pero si no recuerdo mal, solo se trata de almacenar el estado entre sesiones (por ejemplo, 'DynamicModule'). Esto no es lo que necesito. Tenga en cuenta que el código del programa (no el estado) permanece igual entre sesiones, y la variable que monitoreo está codificada. Sin embargo, después de reiniciar el núcleo, deja de funcionar, ya sea porque no se actualiza dinámicamente o porque el '' $ CellContext' '' before 'x' en la paleta causa problemas (solo una suposición, no pude verificar o corregir esto)) – Szabolcs

+3

Tenga en cuenta que, si sale del kernel del menú desplegable, Evauation-> Quit kernel -> Local, su paleta seguirá funcionando después de iniciar una nueva sesión. –

Respuesta

3

Sólo puedo imaginar, porque en mis Ubuntu aquí la situación parece buggy. El truco con el Quit del menú, como sugirió Leonid, no funcionó aquí. Otra es: en una sesión de Mathematica fresco con sólo un cuaderno abierto:

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

da como era de esperar

2 
1 
2 
2 

Escribir en la siguiente línea Quit, evaluar y escribir a continuación x=3 actualizaciones sólo la primera de las Dinámico [x].

No obstante, se ha marcado el comando

Internal`GetTrackedSymbols[] 

Esto proporciona no sólo los símbolos de orugas, pero, además, algún tipo de identificación que pertenece el contenido dinámico. Si puede averiguar qué son exactamente estos números e investigar en las otras funciones que encuentre en el contexto interno, es posible que pueda agregar manualmente el contenido dinámico de su paleta después de reiniciar el kernel.

pensé que tenía algo por el estilo con

Internal`SetValueTrackExtra 

pero actualmente no soy capaz de reproducir el comportamiento.

+0

Más hallazgos interesantes. Puedo reproducir su hallazgo sobre la segunda 'Dinámica' que no se actualiza, ni siquiera cuando uso el comando de menú para salir. – Szabolcs

+0

Curiosamente, se necesitan dos 'Quit []' so dos invocaciones de 'Salir Kernel-Local' en el menú' Evaluación' para borrar ambas expresiones dinámicas al valor 'x'. Luego, escribiendo 'x = 3' actualiza ambos. – kglr

+0

Aún más divertido, se necesitan tantos 'Quit []' s como el número de 'Dynamic [x]' s en todos los cuadernos abiertos para borrar todo al valor 'x'. – kglr

3

@ respuesta de halirutan sacudió mi memoria ...

¿Alguna vez ha llegado a través de: Experimental/ref/ValueFunction?(Dirección de la documentación)

Aunque la documentación no contiene ejemplos, la sección 'Más información' proporciona la siguiente dato:

La asignación ValueFunction[symb] = f especifica que cada vez symb consigue un nuevo valor val, la expresión f[symb,val] debe be evaluado.

+0

¡Un hallazgo interesante! No resuelve el problema con el reinicio del kernel, y 'Dynamic' que detiene la actualización (si encuentra una solución para eso utilizando esta función, ¡por favor hágamelo saber!), ¡Pero definitivamente vale la pena mencionarlo! – Szabolcs

Cuestiones relacionadas