Referencia de columna en función personalizadaTeniendo esta tabla:
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] )
)Me gustaría crear una función personalizada que haga lo mismo que la fórmula en la columna N Categorías.
Convertirlo en un script de función personalizada en el editor de fórmulas me da algo como esto:
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>Pero ahora los parámetros, que antes eran referencias de columnas, simplemente se convierten en parámetros que contienen los valores de las filas.
Entonces mi pregunta es: ¿Es posible crear una función personalizada que trate los parámetros como referencias de columna?
Podría hacerlo funcionar tratando los parámetros como nombres de columnas y transfiriendo cadenas, ¡pero no sería lo mismo!
Re: Referencia de columna en función personalizada
@John Madden escribió:Pero si quiero escribir funciones personalizadas que funcionen limpiamente en fórmulas de columna para usuarios ingenuos que no esperan esta solución
Además usuarios ingenuos , también es el propio Jmp: "funciones de transformación" donde fallan las soluciones alternativas disponibles.
Re: Referencia de columna en función personalizadaEn cuanto al Plan B, haciendo referencia a una columna, Acabo de recibir esta respuesta de Jmp Support TS-00063463

Re: Referencia de columna en función personalizadaParece que me quedé atrapado con la misma pregunta:
Función personalizada: cómo hacer referencia a la columna
... incluso el mismo caso de aplicación.
En cuanto al recuento único, hay una entrada en la lista de deseos esperando felicitaciones:
nueva función JSL: Col N Categorías
En cuanto al tema con haciendo referencia a una columna , hay un deseo, en realidad relacionado, pero con un tema diferente:
Opción o función para evaluar una fórmula de columna personalizada a la vez o almacenar en caché valores entre filas
... pero, sin embargo, menciona el problema de hacer referencia a una columna en la última oración:

Re: Referencia de columna en función personalizadaSólo diré que lo mejor que se me ha ocurrido hasta ahora (y en realidad no es lo que quiero) es encerrar el parámetro de columna en una instrucción Name Expr(). Por ejemplo, dada una tabla de datos con una columna denominada ":Columna 1", esto funciona:
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));pero no puedes hacer esto:
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: Referencia de columna en función personalizadaMe gustaría volver a plantear esta pregunta, ya que yo también he luchado con este problema durante... parece una eternidad.
¿Alguien tiene una forma confiable de escribir una función personalizada (función de usuario) de modo que acepte una referencia de columna (por ejemplo: Columna 1) como parámetro?
Mi solución siempre ha sido pasar el nombre de la columna como una cadena y luego, dentro de la función, usar Column() o As Column(), según las circunstancias, para generar la referencia.
Pero si quiero escribir funciones personalizadas que funcionen limpiamente en fórmulas de columna para usuarios ingenuos que no esperan esta solución, sería bueno poder pasar la referencia de la columna o el nombre de la columna (tal como lo hace uno, o eso parece). , para funciones nativas).
John
Re: Referencia de columna en función personalizadaGracias por su respuesta. Después me di cuenta de que hay otros problemas como que x no puede ser local, pero esto se puede solucionar.
Pero no pude entender cómo pasar una referencia de columna en la llamada a la función. Tuve un problema similar hace algún tiempo y lo resolví pasando los nombres de las columnas como cadenas. Como en el siguiente ejemplo, eso funciona:
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>Se puede llamar así en una fórmula de columna:

Pero requiere cadenas en lugar de referencias de columnas. Puedo reformular mi pregunta: ¿Es posible de alguna manera cambiar lo anterior para que la función N Categorías acepte referencias de columnas en lugar de cadenas?
Re: Referencia de columna en función personalizada1. Para todos los miembros de la comunidad que están confundidos y buscan "Agregar funciones personalizadas()", esta es una característica que se agregará a JMP 14.
2. @thomasz , no creo que puedas esperar que la función que estás creando sea idéntica a la fórmula.Su fórmula no es una fórmula genérica, es una fórmula codificada, a diferencia de lo que intenta hacer con la función.Así que, naturalmente, tendrá que haber diferencias. Creo que hay que pensar en términos de cómo sería la fórmula, si fuera una función genérica, y luego desarrollar la fórmula como tal.Consulte a continuación una fórmula genérica similar que preparé.
