¿Cómo creo una función de transformación personalizada que toma varias columnas como entradas?La guía de secuencias de comandos es bastante útil para describir cómo crear nuevas funciones de transformación personalizadas, pero no está muy claro cómo manejar varias columnas.
¿Cómo creo una función de transformación personalizada que toma varias columnas como entradas? Por ejemplo, si selecciono una columna X, una Y y una Z y quiero tomar el RSS (root-sum-squared) de esas tres columnas.
Además, si el orden importa, ¿cómo se establece ese orden? ¿Es el orden en que se seleccionan las columnas?
Re: ¿Cómo creo una función de transformación personalizada que toma varias columnas como entradas?funcDef = Function( { number }, { i, sum },
If( Is List( number ),
Sqrt( Summation( i = 1, N Items( number ), number[i]^2 ) ),
.
);
);
description = "This function returns the root sum squared of a list numbers.";
parmHint = "a list of numbers";
/* create function using variables
the commands can also be accepted as arguments in New Custom Function */
newAdd = New Custom Function( "mySpace", "RSS", funcDef );
newAdd << Description( description );
newAdd << Prototype( "mySpace:RSS( {} )" );
newAdd << Example( "mySpace:RSS( {1,2,3} )" );
// expr() Examples need to be passed inside NameExpr()
newAdd << Parameter( "List", parmHint );
newAdd << Formula Category( "MyNumberStuff" );
// add mySpace:RSS function to system
Add Custom Functions( newAdd );Re: ¿Cómo creo una función de transformación personalizada que toma varias columnas como entradas?Lo siento, soy tan lento, no tengo idea de cómo hacer eso.Re: ¿Cómo creo una función de transformación personalizada que toma varias columnas como entradas?Bien, luego reemplace el espacio de nombres Here con uno propio.
Re: ¿Cómo creo una función de transformación personalizada que toma varias columnas como entradas?Copié/pegué esa función en un nuevo script JSL y lo ejecuté, pero el registro muestra este error: "No se puede redefinir un espacio de nombres JMP predefinido"Re: ¿Cómo creo una función de transformación personalizada que toma varias columnas como entradas?Aquí hay una nueva función que toma una lista y devuelve el mismo cálculo.
Names Default to Here( 1 );
// example
my numbers = List( 1, 2, 3, 4, 5 );
// define it
funcDef = Function( { number }, { i, sum },
If( Is List( number ),
Sqrt( Summation( i = 1, N Items( number ), number[i]^2 ) ),
.
);
);
// test it
Show( funcDef( my numbers ) );Re: ¿Cómo creo una función de transformación personalizada que toma varias columnas como entradas?Buscaré los parámetros de la lista, gracias.
No tengo idea de lo que está hablando con las comillas dobles, o la base del comentario sobre JMP que proporciona funciones y transformaciones personalizadas.Re: ¿Cómo creo una función de transformación personalizada que toma varias columnas como entradas?Evito cualquier cosa entre comillas dobles. Por lo general, no tienen un valor duradero. JMP proporciona funciones personalizadas y transformaciones personalizadas. ¿Por qué no usarlos como estaban destinados?
Siempre puede usar un parámetro de lista en lugar de un parámetro escalar si su función debe funcionar con una cantidad variable de argumentos.
Re: ¿Cómo creo una función de transformación personalizada que toma varias columnas como entradas?¡Gracias por la respuesta, Marcos! Un par de preguntas rápidas de seguimiento:
1. Sé que JMP *admite* funciones de transformación de varias columnas, ¿es solo que aún no admite transformaciones *personalizadas* de varias columnas?
2. Su función toma 3 argumentos: ¿es posible definir una función que tome un número arbitrario de argumentos?Re: ¿Cómo creo una función de transformación personalizada que toma varias columnas como entradas?Creo que una función personalizada es una mejor opción para su caso. La transformación personalizada está restringida a una sola entrada. La función personalizada no está restringida de esta manera.
funcDef = Function( {x, y, z}, Sqrt( Sum( x^2, y^2, z^2 ) ) );
description = "This function returns the root sum squared of three numbers.";
// examples can be multiple statements inside expr()
ex2 = Expr(
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Here:RSS( :age[1], :age[2], :age[3] );
);
parmHint1 = "x value";
parmHint2 = "y value";
parmHint3 = "z value";
/* create function using variables
the commands can also be accepted as arguments in New Custom Function */
newAdd = New Custom Function( "Here", "RSS", funcDef );
newAdd << Description( description );
newAdd << Prototype( "Here:RSS(x,y,z)" );
newAdd << Example( "Here:RSS(1,2,3)" );
// expr() Examples need to be passed inside NameExpr()
newAdd << Example( Name Expr( ex2 ) );
newAdd << Parameter( "Number", parmHint1 );
newAdd << Parameter( "Number", parmHint2 );
newAdd << Parameter( "Number", parmHint3 );
newAdd << Formula Category( "NumberStuff" );
// add myNamespace:Add Ten function to system
Add Custom Functions( newAdd );
La expresión dentro de su función puede incluir lógica para abordar cualquier necesidad de orden adecuado.