Comment créer une fonction de transformation personnalisée qui prend plusieurs colonnes en entrée ?Le guide de script est assez utile pour décrire comment créer de nouvelles fonctions de transformation personnalisées, mais il n'est pas très clair sur la façon de gérer plusieurs colonnes.
Comment créer une fonction de transformation personnalisée qui prend plusieurs colonnes en entrée ? Par exemple, si je sélectionne les colonnes X, Y et Z et que je veux prendre le RSS (root-sum-squared) de ces trois colonnes ?
De plus, si l'ordre est important, comment cet ordre est-il défini ? Est-ce l'ordre dans lequel les colonnes sont sélectionnées ?
Re : Comment créer une fonction de transformation personnalisée qui prend plusieurs colonnes en entrée ?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 : Comment créer une fonction de transformation personnalisée qui prend plusieurs colonnes en entrée ?Désolé, je suis si lent, je ne sais pas comment faire.Re : Comment créer une fonction de transformation personnalisée qui prend plusieurs colonnes en entrée ?OK, puis remplacez l'espace de noms Here par l'un des vôtres.
Re : Comment créer une fonction de transformation personnalisée qui prend plusieurs colonnes en entrée ?J'ai copié/collé cette fonction dans un nouveau script JSL et l'ai exécuté, mais le journal affiche cette erreur : "Impossible de redéfinir un espace de noms JMP prédéfini"Re : Comment créer une fonction de transformation personnalisée qui prend plusieurs colonnes en entrée ?Voici une nouvelle fonction qui prend une liste et renvoie le même calcul.
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 : Comment créer une fonction de transformation personnalisée qui prend plusieurs colonnes en entrée ?Je vais chercher les paramètres de la liste, merci.
Aucune idée de ce dont vous parlez sur les guillemets doubles, ou de la base du commentaire sur JMP fournissant des fonctions et des transformations personnalisées.Re : Comment créer une fonction de transformation personnalisée qui prend plusieurs colonnes en entrée ?J'évite tout ce qui est entre guillemets doubles. Ils n'ont généralement aucune valeur durable. JMP fournit des fonctions personnalisées et des transformations personnalisées. Pourquoi ne pas les utiliser comme prévu ?
Vous pouvez toujours utiliser un paramètre de liste au lieu d'un paramètre scalaire si votre fonction doit fonctionner avec un nombre variable d'arguments.
Re : Comment créer une fonction de transformation personnalisée qui prend plusieurs colonnes en entrée ?Merci pour la réponse, Marc ! Quelques questions de suivi rapides :
1. Je sais que JMP * prend en charge * les fonctions de transformation multi-colonnes - est-ce simplement qu'il ne prend pas encore en charge les transformations multi-colonnes * personnalisées *?
2. Votre fonction prend 3 arguments -- est-il possible de définir une fonction qui prend un nombre arbitraire d'arguments ?Re : Comment créer une fonction de transformation personnalisée qui prend plusieurs colonnes en entrée ?Je pense qu'une fonction personnalisée est un meilleur choix pour votre cas. La transformation personnalisée est limitée à une seule entrée. La fonction personnalisée n'est pas limitée de cette façon.
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 );
L'expression à l'intérieur de votre fonction peut inclure une logique pour répondre à tout besoin d'ordre approprié.