自定义函数中的列引用有这张表:
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] )
)我想创建一个自定义函数,执行与 N 个类别列中的公式相同的操作。
在公式编辑器中将其转换为自定义函数脚本会给我这样的结果:
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>但现在参数(之前是列引用)变成了包含行值的参数。
所以我的问题是:是否可以创建一个将参数视为列引用的自定义函数?
我可以通过将参数视为列名并传输字符串来使其工作,但它不会相同!
回复:自定义函数中的列引用
@约翰_马登写道:但是,如果我想为不期望这种解决方法的天真的用户编写可以在列公式中干净工作的自定义函数
除了幼稚的用户,这也是 Jmp 本身:可用解决方案失败的“转换函数”。
回复:自定义函数中的列引用关于B计划,引用一个列,我刚刚收到 Jmp 支持 TS-00063463 的回复

回复:自定义函数中的列引用看来我被同样的问题困扰了:
自定义函数 - 如何引用列
...即使是相同的应用案例。
关于 count unique,有一个愿望清单条目正在等待 Kudos:
新的 JSL 功能:Col N 类别
关于问题引用列,有一个愿望 - 实际上相关,但主题不同:
用于立即计算自定义列公式或缓存行之间的值的选项或函数
...但尽管如此,它在最后一句中提到了引用列的问题:

回复:自定义函数中的列引用我只想说,到目前为止我能想到的最好的办法——这并不是我真正想要的——是将列参数包含在 Name Expr() 指令中。 例如,给定一个包含名为“:Column 1”的列的数据表,此方法有效:
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));但你不能这样做:
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 error回复:自定义函数中的列引用我想重新提出这个问题,因为我也一直在这个问题上挣扎——似乎永远如此。
有谁有可靠的方法来编写自定义函数(用户函数),以便它接受列引用(例如:Column 1)作为参数?
我的解决方法始终是将列名作为字符串传递,然后在函数内部根据情况使用 Column() 或 As Column() 来生成引用。
但是,如果我想编写可以在列公式中为不期望这种解决方法的天真的用户干净地工作的自定义函数,那么如果能够传递列引用或列名称(就像一个人所做的那样,或者看起来是这样),那就太好了,对于本机函数)。
约翰
回复:自定义函数中的列引用感谢您的回复。 后来我意识到还有一些其他问题,例如 x 不能是本地的,但这可以解决。
但我不知道如何在函数调用中传递列引用。 我前段时间遇到了类似的问题,并解决了将列名作为字符串传递的问题。 如下例所示,它有效:
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>可以在列公式中这样调用:

但它需要字符串而不是列引用。 我可以重新表述我的问题:是否可以以某种方式更改上述内容,以便 N Categories 函数接受列引用而不是字符串?
回复:自定义函数中的列引用1.对于所有感到困惑并正在寻找“添加自定义函数()”的社区成员,这是 JMP 14 中添加的一项功能。
2. @托马斯,我认为您不能期望您正在构建的函数与公式相同。您的公式不是通用公式,它是硬编码公式,与您尝试使用该函数执行的操作不同。所以自然会有差异。 我认为您需要考虑公式会是什么样子(如果它是通用函数),然后开发公式。请参阅下面我整理的类似通用公式。
