
ispirato da C'è un modo per estrarre le colonne utilizzate in una formula? E Ian@JMP commento.
dt = New Table( "Get Columns in Formula",
Add Rows( 20 ),
New Column( "H", Numeric, "Continuous", Format( "Best", 12 ), Formula( Random Uniform() ) ),
New Column( "W", Numeric, "Continuous", Format( "Best", 12 ), Formula( Random Uniform() ) ),
New Column( "D", Numeric, "Continuous", Format( "Best", 12 ), Formula( Random Uniform() ) ),
New Column( "V", Numeric, "Continuous", Format( "Best", 12 ), Formula( (:W * :H * :D) / 10 ) )
);
formula = dt:V << getformula();
// function to find leaves in formula that are columns in the table
findColumns = Function( {frm, cols},
{h = Head( frm ), n = N Arg( frm ), i, result = {}}, // local variables
If( n == 0, // head node has no children, it is a leaf
If( Contains( cols, Name Expr( h ) ), // is the leaf in the list of columns?
Insert Into( result, Name Expr( h ) ); // yes -> add to result
)
,
For( i = 1, i <= n, i++, // not a leaf, get children's results
Insert Into( result, Recurse( Arg( frm, i ), cols ) )
)
);
result// return the result
);
answer = findColumns( Name Expr( formula ), dt << GetColumnNames );
Show( formula, answer );
formula = (:L * :A * :P) / 10;
risposta = {:L, :H,
};
IL findColumns la funzione definita alle righe 10-22 accetta due argomenti, frm , la formula da esaminare, e col , un elenco di nomi di colonne validi da estrarre.IL Testa dell'espressione di esempio è Divide(...) che ha due figli (la risposta da N Arg ). L'istruzione if vede che ci sono bambini e usa il ricorso funzione per elaborare ogni bambino.Il bambino moltiplicato ha tre figli.il :W figlio non ha figli e l'elenco di colonne dalla tabella dati contiene :W, quindi :W lo è inserito in un elenco e l'elenco restituito, dove tale elenco viene inserito in un elenco.Il bambino moltiplicatore invia quindi il 2o arg ricorsivo e viene aggiunto :H.Alla fine il 10 (il 2° figlio di Divide) viene inviato alla ricorsione, ma non è nell'elenco delle colonne, quindi non appare nella risposta.
La ricorsione richiede ogni volta un certo sforzo.Ma rende un programma dall'aspetto semplice.