Riferimento alla colonna nella funzione personalizzataAvendo questa tabella:
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] )
)Vorrei creare una funzione personalizzata che faccia la stessa cosa della formula nella colonna N Categorie.
Convertendolo in uno script di funzioni personalizzate nell'editor di formule mi dà qualcosa del genere:
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>Ma ora i parametri, prima di essere riferimenti di colonna, diventano semplicemente parametri contenenti i valori delle righe.
Quindi la mia domanda è: è possibile creare una funzione personalizzata che tratti i parametri come riferimenti a colonne?
Potrei farlo funzionare trattando i parametri come nomi di colonne e trasferindo invece stringhe, ma non sarebbe la stessa cosa!
Ri: Riferimento alla colonna nella funzione personalizzata
@john_madden ha scritto:Ma se voglio scrivere funzioni personalizzate che funzionino in modo pulito nelle formule di colonna per gli utenti ingenui che non si aspettano questa soluzione alternativa
Oltretutto utenti ingenui , è anche lo stesso Jmp: "funzioni di trasformazione" in cui le soluzioni alternative disponibili falliscono.
Ri: Riferimento alla colonna nella funzione personalizzataPer quanto riguarda il piano B, riferimento a una colonna, Ho appena ricevuto questa risposta dal supporto Jmp TS-00063463

Ri: Riferimento alla colonna nella funzione personalizzataSembra che mi sono bloccato con la stessa domanda:
Funzione personalizzata: come fare riferimento alla colonna
...anche lo stesso caso applicativo.
Per quanto riguarda il conteggio unico, c'è una voce nella lista dei desideri in attesa di Kudos:
nuova funzione JSL: Categorie Col N
Per quanto riguarda la questione con riferimento a una colonna , c'è un desiderio - in realtà correlato, ma argomento diverso:
Opzione o funzione per valutare contemporaneamente una formula di colonna personalizzata o memorizzare nella cache i valori tra le righe
... ma tuttavia menziona il problema relativo al riferimento a una colonna nell'ultima frase:

Ri: Riferimento alla colonna nella funzione personalizzataDirò solo che la cosa migliore che sono riuscito a trovare finora, e non è proprio quello che voglio, è racchiudere il parametro della colonna in un'istruzione Name Expr(). Ad esempio, data una tabella di dati con una colonna denominata ":Column 1" funziona:
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));ma non puoi farlo:
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 errorRi: Riferimento alla colonna nella funzione personalizzataVorrei porre nuovamente questa domanda, poiché anch'io ho lottato con questo problema per - sembra da sempre.
Qualcuno ha un modo affidabile per scrivere una funzione personalizzata (funzione utente) in modo tale da accettare un riferimento di colonna (ad esempio: Colonna 1) come parametro?
La mia soluzione è sempre stata quella di passare il nome della colonna come stringa e quindi, all'interno della funzione, utilizzare Column() o As Column(), a seconda delle circostanze, per generare il riferimento.
Ma se voglio scrivere funzioni personalizzate che funzionino in modo pulito nelle formule di colonna per gli utenti ingenui che non si aspettano questa soluzione alternativa, sarebbe bello poter passare invece il riferimento alla colonna o il nome della colonna (proprio come si fa, o almeno così sembra , per le funzioni native).
John
Ri: Riferimento alla colonna nella funzione personalizzataGrazie per la tua risposta. In seguito mi sono reso conto che ci sono altri problemi come x non può essere locale, ma questo può essere risolto.
Ma non sono riuscito a capire come passare un riferimento a una colonna nella chiamata alla funzione. Ho avuto un problema simile qualche tempo fa e l'ho risolto passando i nomi delle colonne come stringhe. Come nell'esempio seguente che funziona:
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>Può essere chiamato in questo modo in una formula di colonna:

Ma richiede stringhe invece di riferimenti a colonne. Posso riformulare la mia domanda: è in qualche modo possibile modificare quanto sopra in modo che la funzione N Categorie accetti riferimenti a colonne anziché stringhe?
Ri: Riferimento alla colonna nella funzione personalizzata1. Per tutti i membri della comunità che sono confusi e cercano "Aggiungi funzioni personalizzate()", questa è una funzionalità che verrà aggiunta a JMP 14.
2. @thomasz , non penso che tu possa aspettarti che la funzione che stai costruendo sia identica alla formula.La tua formula non è una formula generica, è una formula codificata, a differenza di ciò che stai tentando di fare con la funzione.Quindi ci saranno naturalmente delle differenze. Penso che tu debba pensare in termini di come sarebbe la formula, se fosse una funzione generica, e poi sviluppare la formula come tale.Vedi sotto per una formula generica simile che ho messo insieme.
