
inspiré par Existe-t-il un moyen d'extraire les colonnes utilisées dans une formule ? et Ian@JMP commentaire.
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 );
formule = (:W * :H *
) / 10 ;
réponse = {:W, :H,
} ;
Le trouver des colonnes la fonction définie aux lignes 10 à 22 prend deux arguments, frm , la formule à examiner, et cols , une liste de noms de colonnes valides à extraire.Le Tête de l'exemple d'expression est Divide(...) qui a deux enfants (la réponse de N Arg ). L'instruction if voit qu'il y a des enfants et utilise le récursion fonction pour traiter chaque enfant.L'enfant multiplié a trois enfants.l'enfant :W n'a pas d'enfant et la liste des colonnes de la table de données contient :W, donc :W est inséré dans une liste et la liste renvoyée, où cette liste est insérée dans une liste.L'enfant multiplié envoie alors le 2ème argument pour récurer et :H est ajouté.Finalement le 10 (le 2ème enfant de Divide) est envoyé à recurse, mais ne figure pas dans la liste des colonnes, il n'apparaît donc pas dans la réponse.
La récursivité demande des efforts à chaque fois.Mais cela donne un programme simple.