Référence de colonne dans la fonction personnaliséeAvoir ce tableau :
New Table( "test table",
Add Rows( 9 ),
New Column( "By column",
Character( 1 ),
"Nominal",
Set Selected,
Set Values( {"a", "a", "a", "b", "b", "b", "c", "c", "c"} )
),
New Column( "Categories",
Character( 1 ),
"Nominal",
Set Values( {"t", "t", "r", "y", "t", "r", "r", "r", "r"} )
),
New Column( "N Categories",
Expression,
"None",
Formula(
If( Row() == 1,
Summarize( x = by( :By column, :Categories ) ),
Empty()
);
N Items( Loc( x[1], :By column ) );
),
Set Display Width( 109 )
),
Set Row States( [1, 0, 0, 0, 0, 0, 0, 0, 0] )
)Je voudrais créer une fonction personnalisée faisant la même chose que la formule dans la colonne N Catégories.
Le convertir en script de fonction personnalisé dans l'éditeur de formule me donne quelque chose comme ceci :
Add Custom Functions(
{New Custom Function(
"custom",
"N Categories",
Function( {Categories,By column},
{Default Local},
If( Row() == 1,
Summarize( x = by( By column, Categories ) ),
Empty()
);
N Items( Loc( x[1], By column ) );
),
<<DESCRIPTION></DESCRIPTION>Mais maintenant, les paramètres, qui étaient auparavant des références de colonnes, deviennent simplement des paramètres contenant les valeurs des lignes.
Ma question est donc la suivante : est-il possible de créer une fonction personnalisée qui traite les paramètres comme des références de colonne ?
Je pourrais le faire fonctionner en traitant les paramètres comme des noms de colonnes et en transférant des chaînes, mais ce ne serait pas pareil !
Re : Référence de colonne dans une fonction personnalisée
@john_madden a écrit:Mais si je veux écrire des fonctions personnalisées qui fonctionnent proprement dans des formules de colonnes pour les utilisateurs naïfs qui ne s'attendent pas à cette solution de contournement
En plus utilisateurs naïfs , c'est aussi Jmp lui-même : des « fonctions de transformation » où les solutions de contournement disponibles échouent.
Re : Référence de colonne dans une fonction personnaliséeConcernant le plan B, référencer une colonne, Je viens de recevoir cette réponse du support Jmp TS-00063463

Re : Référence de colonne dans une fonction personnaliséeIl semble que je me pose la même question :
Fonction personnalisée - comment référencer la colonne
... même le même cas d'application.
Concernant le nombre unique, il y a une entrée dans la liste de souhaits en attente de félicitations :
nouvelle fonction JSL : Col N Catégories
Concernant le problème avec référencer une colonne , il y a un souhait - en fait lié, mais sujet différent :
Option ou fonction pour évaluer une formule de colonne personnalisée en même temps ou mettre en cache les valeurs entre les lignes
... mais néanmoins, il mentionne le problème du référencement d'une colonne dans la dernière phrase :

Re : Référence de colonne dans une fonction personnaliséeJe dirai simplement que le mieux que j'ai pu trouver jusqu'à présent - et ce n'est pas vraiment ce que je veux - est d'enfermer le paramètre de colonne dans une instruction Name Expr(). Par exemple, étant donné une table de données avec une colonne nommée ":Column 1", cela fonctionne :
Names Default To Here( 1 );
dt = Current Data Table();
Add Custom Functions(
New Custom Function(
"x",
"Testf",
Function( {col},
{i},
For Each Row( dt, Print( col ) );
)
)
);
x:Testf(Name Expr(dt:Column 1));mais tu ne peux pas faire ça :
dt = Current Data Table();
Add Custom Functions(
New Custom Function(
"x",
"Testf",
Function( {Name Expr(col)}, // JSL interpreter gives error for this syntax
{i},
For Each Row( dt, Print( col ) );
)
)
);
x:Testf(dt:Column 1); // hypothetical, as the function definition is in errorRe : Référence de colonne dans une fonction personnaliséeJ'aimerais reposer cette question, car moi aussi je me bats avec ce problème depuis - cela semble être une éternité.
Quelqu'un a-t-il un moyen fiable d'écrire une fonction personnalisée (fonction utilisateur) de telle sorte qu'elle accepte une référence de colonne (par exemple : Colonne 1) comme paramètre ?
Ma solution de contournement a toujours consisté à transmettre le nom de la colonne sous forme de chaîne, puis, à l'intérieur de la fonction, à utiliser Column() ou As Column(), selon les circonstances, pour générer la référence.
Mais si je veux écrire des fonctions personnalisées qui fonctionnent proprement dans des formules de colonne pour les utilisateurs naïfs qui ne s'attendent pas à cette solution de contournement, ce serait bien de pouvoir transmettre la référence de colonne à la place ou le nom de colonne (comme on le fait, du moins il semble , pour les fonctions natives).
John
Re : Référence de colonne dans une fonction personnaliséeMerci pour votre réponse. J'ai réalisé par la suite qu'il y avait d'autres problèmes comme x ne peut pas être local, mais cela peut être résolu.
Mais je n'arrivais pas à comprendre comment transmettre une référence de colonne dans l'appel de fonction. J'ai eu un problème similaire il y a quelque temps et je l'ai résolu en passant les noms de colonnes sous forme de chaînes. Comme dans l'exemple ci-dessous qui fonctionne :
names default to here(1);
Add Custom Functions(
{New Custom Function(
"NNE",
"N Categories",
Function( {Categories, ByColumn},{Default local},
If( Row() == 1,
Summarize( here:x = by( column(ByColumn), column(Categories) ) );
);
N Items( Loc( here:x[1], column(ByColumn)[row()] ) );
),
<<DESCRIPTION></DESCRIPTION>Il peut être appelé ainsi dans une formule de colonne :

Mais cela nécessite des chaînes au lieu de références de colonnes. Je peux reformuler ma question : est-il possible de modifier ce qui précède afin que la fonction N Catégories accepte les références de colonnes au lieu des chaînes ?
Re : Référence de colonne dans une fonction personnalisée1. Pour tous les membres de la communauté qui sont confus et recherchent « Ajouter des fonctions personnalisées () », il s'agit d'une fonctionnalité qui est ajoutée à JMP 14.
2. @thomasz , je ne pense pas que vous puissiez vous attendre à ce que la fonction que vous construisez soit identique à la formule.Votre formule n'est pas une formule générique, c'est une formule codée en dur, contrairement à ce que vous essayez de faire avec la fonction.Il va donc naturellement falloir qu’il y ait des différences. Je pense que vous devez réfléchir à ce à quoi ressemblerait la formule, s'il s'agissait d'une fonction générique, puis développer la formule en tant que telle.Voir ci-dessous pour une formule générique similaire que j'ai élaborée.
