Differenza tra i cicli FOR e FOR EACHQualcuno può spiegare perché questo:
dt = Open( "$SAMPLE_DATA/Fitness.jmp" );
col = { :Runtime, :RunPulse, :RstPulse };
y expr = Expr( Y() );
For( c = 1, c <= N Items( col ), c++,
Insert Into( y expr, col[c] );
);
Name Expr(y expr);produce l’output atteso
Y( :Runtime, :RunPulse, :RstPulse )
ma questo:
dt = Open( "$SAMPLE_DATA/Fitness.jmp" );
col = { :Runtime, :RunPulse, :RstPulse };
y expr = Expr( Y() );
For each({coll, index},col,
Insert Into( y expr, coll );
);
Name Expr(y expr);produce questo:
Y( ., ., . )
Mi aspetterei che dia lo stesso risultato? Come dovrei modificare il ciclo FOR EACH per dare lo stesso risultato?
Ricerche sui consumatori e sul mercatoCondivisione e comunicazione dei risultatiRi: Differenza tra i cicli FOR e FOR EACHNon si tratta di un bug: in questo caso si tratta effettivamente della coerenza di JMP.Quando si indicizza un elenco il risultato viene restituito senza valutazione.Quando si memorizza il risultato di un elemento indicizzato in una variabile, viene quindi valutato il risultato.Ricordati che For Each( {valore, indice}, lista, espressione... ) è equivalente a For( indice = 1, indice <= N elementi( lista ), indice++, valore = lista[indice]; espressione... )
A = {1 + 2, 2 + 3, 3 + 4};
b = {};
res = A[1];
Insert Into( b, A[1] );
Insert Into( b, res );
b
/*:
{1 + 2, 3}
Ri: Differenza tra i cicli FOR e FOR EACHSì, è proprio questo.
È un comportamento strano, poiché 1. abbiamo l'istruzione For Each Row per la valutazione per riga e 2. For Each dovrebbe trattare un elenco (e sto cercando di lavorare con un elenco di riferimenti a colonne) come il ciclo For.
È un bug o è un comportamento previsto?
Ri: Differenza tra i cicli FOR e FOR EACHLa mia ipotesi è che le colonne vengano valutate nei valori delle righe correnti in For Each (puoi testarlo aggiungendo Row() = 1; per esempio). Potresti essere in grado di evitarlo utilizzando Name Expr()
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Fitness.jmp");
col = {:Runtime, :RunPulse, :RstPulse};
y expr = Expr(Y());
For(c = 1, c <= N Items(col), c++,
Insert Into(y expr, col[c]);
);
Show(Name Expr(y expr));
Row() = 1;
y expr = Expr(Y());
For Each({coll, index}, col,
Insert Into(y expr, coll);
);
Show(Name Expr(y expr));
y expr = Expr(Y());
For Each({coll, index}, col,
Insert Into(y expr, Name Expr(coll));
);
Show(Name Expr(y expr));