Spaltenreferenz in benutzerdefinierter FunktionHabe diese Tabelle:
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] )
)Ich möchte eine benutzerdefinierte Funktion erstellen, die dasselbe tut wie die Formel in der Spalte „N Kategorien“.
Wenn ich es im Formeleditor in ein benutzerdefiniertes Funktionsskript umwandele, erhalte ich etwa Folgendes:
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>Aber jetzt werden die Parameter, die zuvor Spaltenreferenzen waren, einfach zu Parametern, die die Werte der Zeilen enthalten.
Meine Frage lautet also: Ist es möglich, eine benutzerdefinierte Funktion zu erstellen, die die Parameter als Spaltenreferenzen behandelt?
Ich könnte es zum Laufen bringen, indem ich die Parameter als Spaltennamen behandle und stattdessen Zeichenfolgen übertrage, aber es wäre nicht dasselbe!
Betreff: Spaltenreferenz in benutzerdefinierter Funktion
@John madden schrieb:Aber wenn ich benutzerdefinierte Funktionen schreiben möchte, die sauber in Spaltenformeln funktionieren, für naive Benutzer, die diese Problemumgehung nicht erwarten
Außerdem naive Benutzer , es ist auch Jmp selbst: „Transformationsfunktionen“, bei denen die verfügbaren Problemumgehungslösungen versagen.
Betreff: Spaltenreferenz in benutzerdefinierter FunktionWas Plan B betrifft, Verweisen auf eine Spalte, Ich habe gerade diese Antwort vom Jmp-Support TS-00063463 erhalten

Betreff: Spaltenreferenz in benutzerdefinierter FunktionAnscheinend bin ich bei der gleichen Frage hängengeblieben:
Benutzerdefinierte Funktion – So referenzieren Sie die Spalte
... sogar der gleiche Anwendungsfall.
Bezüglich Count Unique gibt es einen Wunschlisteneintrag, der auf Kudos wartet:
neue JSL-Funktion: Col N Kategorien
Bezüglich des Problems mit Verweisen auf eine Spalte , da ist ein Wunsch – eigentlich verwandt, aber anders thematisiert:
Option oder Funktion zum sofortigen Auswerten einer benutzerdefinierten Spaltenformel oder zum Zwischenspeichern von Werten zwischen Zeilen
... aber dennoch wird im letzten Satz das Problem mit der Referenzierung einer Spalte erwähnt:

Betreff: Spaltenreferenz in benutzerdefinierter FunktionIch sage nur: Das Beste, was mir bisher eingefallen ist – und das ist eigentlich nicht das, was ich will – ist, den Spaltenparameter in eine Name Expr()-Anweisung einzuschließen. Bei einer gegebenen Datentabelle mit einer Spalte namens „:Spalte 1“ funktioniert dies beispielsweise:
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));aber das kannst du nicht machen:
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 errorBetreff: Spaltenreferenz in benutzerdefinierter FunktionIch möchte diese Frage noch einmal stellen, da auch ich mit diesem Problem seit – es kommt mir wie eine Ewigkeit – zu kämpfen habe.
Hat jemand eine zuverlässige Möglichkeit, eine benutzerdefinierte Funktion (Benutzerfunktion) so zu schreiben, dass sie eine Spaltenreferenz (z. B.: Spalte 1) als Parameter akzeptiert?
Meine Problemumgehung bestand immer darin, den Spaltennamen als Zeichenfolge zu übergeben und dann innerhalb der Funktion je nach den Umständen Column() oder As Column() zu verwenden, um die Referenz zu generieren.
Wenn ich jedoch benutzerdefinierte Funktionen schreiben möchte, die für naive Benutzer, die diese Problemumgehung nicht erwarten, sauber in Spaltenformeln funktionieren, wäre es schön, stattdessen die Spaltenreferenz oder den Spaltennamen übergeben zu können (genau wie man es tut, oder so scheint es). , für native Funktionen).
John
Betreff: Spaltenreferenz in benutzerdefinierter FunktionDanke für deine Antwort. Später wurde mir klar, dass es noch andere Probleme gibt, zum Beispiel, dass x nicht lokal sein kann, aber das kann behoben werden.
Aber ich konnte nicht herausfinden, wie man im Funktionsaufruf eine Spaltenreferenz übergibt. Ich hatte vor einiger Zeit ein ähnliches Problem und habe es gelöst, indem ich Spaltennamen als Zeichenfolgen übergeben habe. Wie im Beispiel unten funktioniert das:
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>In einer Spaltenformel kann es so aufgerufen werden:

Es erfordert jedoch Zeichenfolgen anstelle von Spaltenverweisen. Ich kann meine Frage umformulieren: Ist es irgendwie möglich, das Obige so zu ändern, dass die N-Kategorien-Funktion Spaltenverweise anstelle von Zeichenfolgen akzeptiert?
Betreff: Spaltenreferenz in benutzerdefinierter Funktion1. Für alle Community-Mitglieder, die verwirrt sind und nach „Benutzerdefinierte Funktionen hinzufügen()“ suchen: Dies ist eine Funktion, die zu JMP 14 hinzugefügt wird.
2. @thomasz Ich glaube nicht, dass Sie erwarten können, dass die Funktion, die Sie erstellen, mit der Formel identisch ist.Ihre Formel ist keine generische Formel, sondern eine fest codierte Formel, im Gegensatz zu dem, was Sie mit der Funktion versuchen.Daher wird es natürlich Unterschiede geben müssen. Ich denke, Sie müssen darüber nachdenken, wie die Formel aussehen würde, wenn es eine generische Funktion wäre, und dann die Formel als solche entwickeln.Unten finden Sie eine ähnliche generische Formel, die ich zusammengestellt habe.
