
inspiriert von Gibt es eine Möglichkeit, in einer Formel verwendete Spalten zu extrahieren? Und Ian@JMP Kommentar.
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 );
Formel = (:W * :H *
) / 10;
Antwort = {:W, :H,
};
Der findColumns Die in den Zeilen 10–22 definierte Funktion benötigt zwei Argumente. frm , die zu untersuchende Formel und Spalten , eine Liste gültiger Spaltennamen zum Extrahieren.Der Kopf des Beispielausdrucks ist Divide(...), der zwei untergeordnete Elemente hat (die Antwort von N Arg ). Die if-Anweisung erkennt, dass Kinder vorhanden sind, und verwendet diese rekursiv Funktion, um jedes Kind zu verarbeiten.Das Multiplikationskind hat drei Kinder.Das :W-Kind hat keine Kinder und die Liste der Spalten aus der Datentabelle enthält :W, also ist :W eingefügt in eine Liste und die zurückgegebene Liste, wobei diese Liste in eine Liste eingefügt wird.Das multiplizierte Kind sendet dann das 2 arg zu rekursieren und :H wird angehängt.Schließlich der 10 (das 2. Kind von Divide) wird an die Rekursion gesendet, befindet sich jedoch nicht in der Spaltenliste und erscheint daher nicht in der Antwort.
Die Rekursion erfordert jedes Mal etwas Aufwand.Aber es ergibt ein einfach aussehendes Programm.