No estoy seguro de cómo se supone que debe verse la animación, pero puedes hacer algo como esto, por ejemplo, usando una nueva imagen, configurando píxeles y marco de anuncio.
O simplemente trazarlo como mapa de calor en GraphBuilder y grabarlo.
Este vídeo está siendo procesado actualmente. Inténtelo de nuevo en unos minutos.
(ver en Mis vídeos)
Otro enfoque: para bucles infinitos.
con la tabla de datos creada sobre la marcha...
dt = New Table( "cellular automaton",
New Column( "pos", Nominal ),
New Column( "step", Nominal ),
New Column( "status", Nominal )
);
dt << add rows( 1 );
:pos[1] = 0;
:step[1] = 1;
:status[1] = 1;
t0 = hptime();
gb = dt << Graph Builder(
Show Control Panel( 0 ),
Show Title( 0 ),
Show X Axis( 0 ),
Show X Axis Title( 0 ),
Variables( X( :pos ), Y( :step ), Color( :status ) ),
Elements( Heatmap( X, Y, Legend( 1 ) ) ),
SendToReport(
Dispatch( {}, "pos", ScaleBox, {Label Row( Tick Mark Style( "Long Divider" ) )} ),
Dispatch( {}, "step", ScaleBox,
{Reversed Scale, Label Row( Tick Mark Style( "Long Divider" ) )}
),
Dispatch( {}, "400", ScaleBox,
{Legend Model(
1,
Properties( 1, {Fill Color( 0 )}, Item ID( "1", 1 ) ),
Properties( 2, {Fill Color( 2 )}, Item ID( "0", 1 ) )
)}
)
)
);
wait(0);
cells = [1];
j=4;
For( i = 2, i > 0, i++,
//i=2
cells = Insert( Insert( cells, 0, 1 ), 0 );
cells0 = Insert( Insert( cells, 0, 1 ), 0 );
cells = Transform Each( {dummy, idx}, cells,
//idx=3;
myPattern = 100 * cells0[idx] + 10 * cells0[idx + 1] + cells0[idx + 2];
Match( mypattern,
100, 1,
11, 1,
10, 1,
1, 1,
0 // all other variants give 0
);
);
Ncells = N Items( cells );
nr = N Rows( dt );
dt << add rows( 2 * i - 1 );
rows = nr + (1 :: Ncells);
dt[rows, "step"] = J( Ncells, 1, i );
dt[rows, "pos"] = ((1 :: Ncells) - i)`;
dt[rows, "status"] = cells;
if(hptime()-t0>10000,wait(0);t0=hptime())
);Debo admitirlo: me tomó un tiempo lograr que el Zoom fuera correcto.
La primera idea: restringir la vista a filas con Datos=1: mientras se calculan las entradas, aparecerán más y más entradas, lo que provocará un alejamiento.
Pero este enfoque no funcionó como se esperaba (ver más abajo).
Observe el filtro de datos: comienza con la configuración correcta: Datos=1 ,
pero cuando se borra la columna y comienza el cálculo, ya no existen esos datos y el filtro de datos simplemente olvida su configuración (!!!).
Este error se describió por primera vez en la detección de valores atípicos (:alien:) con Jmp Dashboards: ¿cómo? .
- algunas soluciones se pueden encontrar aquí
- un deseo de corregir el error: Filtro de datos local: opción: restringir o no restringir a los datos actuales
- una forma más elegante de abordar estos problemas: :folded_hands: Propiedad de columna: valores inclusivos

Todavía es demasiado difícil para mí.
¡Gracias expertos!

¿Qué estás intentando hacer? ¿Tiene una demostración de que JMP es capaz de realizar algún tipo de animación? ¿Tiene un cálculo para https://en.wikipedia.org/wiki/Rule_30 ? ¿Algo totalmente diferente y esto es solo un ejemplo?
Editar:
Cualquiera que sea el caso, publico mi código aquí (aún se pueden hacer muchas optimizaciones)
Ver más...
Names Default To Here(1);
xor = Function({first, second}, {Default Local},
return((first | second) & !(first & second));
);
check_rule30 = function({items}, {Default Local},
// https://en.wikipedia.org/wiki/Rule_30
res = xor(items[1], items[2] | items[3]);
return(res);
);
initial_state = function({width}, {Default Local},
m = J(Floor(width / 2) + 1, width + !Mod(width, 2), 0);
m[1, Floor(width / 2) + 1] = 1;
return(m);
);
cellular_automaton_rule30 = function({width}, {Default Local},
m = initial_state(width);
For(r = 2, r <= N Rows(m), r++,
For(c = 1, c <= N Cols(m[r, 0]), c++,
If(c == 1, // fill [0] for edges
three = [0] || m[r - 1, c::c + 1];
, c == N Cols(m[r, 0]),
three = m[r - 1, c - 1::c] || [0];
,
three = m[r - 1, c - 1::c + 1];
);
res = check_rule30(three);
m[r, c] = res;
);
);
return(m);
);
magnify_matrix = function({m, magnification = 1}, {Default Local},
If(magnification == 1,
return(m);
);
magnified = J(N Rows(m) * magnification, N Cols(m) * magnification);
magnified = Transform Each({z, {row, col}}, magnified,
// and filling each value with one from the small matrix
m[Floor((row - 1) / magnification) + 1, Floor((col - 1) / magnification) + 1]
);
return(magnified);
);
animate_matrix = Function({m_magnified}, {Default Local},
// Substitute Into(m_magnified, 1, -16777215); // to make white white
start = Tick Seconds();
initial = J(N Row(m_magnified), N Col(m_magnified), 0);
initial[1::magnification, 0] = Substitute(m_magnified[1::magnification, 0], 1, -16777215);
img = New Image(initial);
For(i = 1, i < N Rows(m), i++,
indices = (i * magnification + 1)::((i + 1) * magnification);
cur_row = m_magnified[indices, 0];
If(i == N Rows(m) - 1, // could be moved outside of the loop
Substitute Into(cur_row, 1, -16777215);
,
Substitute Into(cur_row, 1, -65280);
);
Substitute Into(cur_row, 1, -65280);
Substitute Into(initial, -65280, -16777215);
initial[indices, 0] = cur_row;
img << Add Frame(10);
img << Set Pixels(initial);
);
wait(0);
end = Tick Seconds();
Write(Eval Insert("animate_matrix: ^Round(end - start, 3)^s.\!N"));
nw = New Window("Multi-Frame Image", img);
durs = img << Get Frame Durations();
For(i = 0, i < img << Get N Frames, i++, // might be off by one
img << Set Current Frame(i);
nw << reshow();
dur = durs[i + 1] / 800.0; // use to modify the speed of animation
Wait(dur);
);
return(img);
);
view_matrix = function({m}, {Default Local},
nw = New Window("Matrix",
pic = New Heat Image(m,
gradient({Color Theme("White to Black"), Scale Values([0 1]), Reverse Gradient(1)})
)
);
);
width = 250;
magnification = 5;
start = Tick Seconds();
m = cellular_automaton_rule30(width);
wait(0);
end = Tick Seconds();
Write(Eval Insert("cellular_automaton_rule30: ^Round(end - start, 3)^s.\!N"));
start = Tick Seconds();
m_magnified = magnify_matrix(m, magnification);
wait(0);
end = Tick Seconds();
Write(Eval Insert("magnify_matrix: ^Round(end - start, 3)^s.\!N"));
animation = animate_matrix(m_magnified);
wait(0);
Write("Done\!N");
