
inspirado por ¿Existe alguna forma de extraer las columnas utilizadas en una fórmula? y Ian@JMP comentario.
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 );
fórmula = (:W * :H *
) / 10;
respuesta = {:W, :H,
};
El buscar columnas La función definida en las líneas 10-22 toma dos argumentos, desde , la fórmula a examinar, y columnas , una lista de nombres de columnas válidos para extraer.El Cabeza de la expresión de ejemplo es Divide(...) que tiene dos hijos (la respuesta de norte arg ). La declaración if ve que hay niños y usa el recursivo función para procesar a cada niño.El niño multiplicado tiene tres hijos.el hijo :W no tiene hijos y la lista de columnas de la tabla de datos contiene :W, por lo que :W es insertado en una lista y la lista devuelta, donde esa lista se inserta en una lista.El niño multiplicado luego envía el segundo argumento para recurrir y se añade :H.Al final el 10 (el segundo hijo de Divide) se envía de forma recursiva, pero no está en la lista de columnas, por lo que no aparece en la respuesta.
La recursividad requiere algo de esfuerzo cada vez.Pero es un programa de apariencia simple.