A質問からaandw列の数式については、この投稿を開始しました。 数式エディタを使用して列数式を作成するだけの場合は、ほとんどすべてを無視できます。 この投稿では、JSLを使用して列式を作成する方法について説明します。
まず、Formulaコマンドについて少し説明します。 これは本当に単純なものです:
The formula for column C adds columns A and BThe formula for column C adds columns A and BThe formula for column C adds columns A and BThe formula for column C adds columns A and B列Cの式は、列AとBを追加します
テーブルスクリプト(左上の三角形->テーブルスクリプトのコピー、エディターへの貼り付け)は次のようになります。
New Table( "abc", Add Rows( 2 ),
New Column( "a", Numeric, "Continuous",Format( "Best", 12 ),Set Values( [1, 7] )),
New Column( "b",Numeric,"Continuous",Format( "Best", 12 ),Set Values( [2, 9] )),
New Column( "c", Numeric, "Continuous", Format( "Best", 12 ),
Formula( :a + :p</img> )
)
)
5行目は式を設定します。式は、列aとbを追加する式です。 式はかなり後になるまで実行されません。 式は、式として列の一部として保存されます。 別の行がテーブルに追加された場合、または列aまたはbの値が変更された場合、式を再度評価して列cの値を取得できます。
これは友好的で珍しい行動です。 ほとんどの関数が引数を評価するため、異常です。sqrt(4 + 5)は3を返します。 列に割り当てられる前にJMPが列の数式を評価することはほとんどないため、使いやすいです。
数式式が非常に複雑になる場合があります。 非常に複雑なので、式を書くためのプログラムを書く方が簡単でしょう。 数式コマンドでこれを行うには、数式コマンドに引数を事前評価し、結果の式を数式として使用するように指示する方法が必要です。 これを行うには、事前評価するコードの周りにeval()ラッパーを追加します。 数式コマンドは、式に「eval」がラップされていることを確認すると、コードを実行して結果を使用します。
lookup = function({t,u}, expr(a+b) );
New Table( "abc",
Add Rows( 2 ),
New Column( "a",Numeric,"Continuous",Format( "Best", 12 ),Set Values( [1, 7] )),
New Column( "b",Numeric,"Continuous",Format( "Best", 12 ),Set Values( [2, 9] )),
New Column( "c", Numeric, "Continuous", Format( "Best", 12 ),
Formula( eval( lookup(1,2) ) )
)
)
ユーザー定義の「ルックアップ」関数(1行目)はそれほど明るくはありませんが、戻り値としてexpr(a + b)を取得するために実行する必要があります。 7行目で、eval()ラッパーは、列の数式が「lookup(1,2)」に設定されず、代わりにlookup(1,2)によって返される式に設定されることを意味します。以前と同じテーブル、同じ列式。
列の数式をeval()で始まる式に設定したい場合はどうなりますか?eval()で開始するということは、引数を評価して結果を使用することを意味するので、数式コマンドはどのようにそれを行うことができますか? (私は興味深い例を思い付くのに苦労していましたが、 MS質問の答えに1つあります。)答えはName Expr()です。 Name Exprは、通常、評価せずにJSL変数から式を取得するために使用されるJSL関数です。 数式コマンドの最も外側のラッパーとして、引数を評価せずに返すだけです。 最初の例では、このような説明を除いて、まったく同じテーブルを返すためにそれを使用できます。
New Table( "abc", Add Rows( 2 ),
New Column( "a", Numeric, "Continuous",Format( "Best", 12 ),Set Values( [1, 7] )),
New Column( "b",Numeric,"Continuous",Format( "Best", 12 ),Set Values( [2, 9] )),
New Column( "c", Numeric, "Continuous", Format( "Best", 12 ),
Formula( Name Expr( :a + :p</img> ) )
)
)
しかし、 MSたとえば、evalを巧妙に使用しているために必要です(おそらく、別のブログ投稿でそれが何をするのかを説明する必要があります)。 これが元の質問の最終的な表です。 2番目の数式列として自分のアイデアを追加しました。
New Table( "final?",Add Rows( 9 ),
New Column( "color",Character,"Nominal",
Set Values({"green", "green", "blue", "yellow", "red", "red", "yellow", "green", "green"})),
New Column( "count",Numeric,"Continuous",Format( "Best", 12 ),
Formula( Name Expr( Eval( Eval Expr( Col Sum( Row() <= Expr( Row() ), :color ) ) ) ) )),
New Column( "another count",Numeric,"Continuous",Format( "Best", 12 ),
Formula(
n = 0;
For( i = 1, i <= Row(), i++,
If( :color == :color[i], n++ )
);
n;
)
)
);
3番目の列の数式は、最後の一致を逆方向に振り返り、そのカウントに1を追加することで、明確さを犠牲にして、より高速になる可能性があります。 明快さと効率はトレードオフです。

そこで、このプロセスで発見されたバグを修正します。データテーブルがそれ自体を再現するスクリプトを作成する場合(上の例のように)、列の数式も再現するためにJSLを生成する必要があります。 列の数式が特別なeval()ラッパーで始まり、evalが数式の一部であると想定される場合、JMPはNameExprを追加する必要があります。
2018年4月21日更新:前のブログからの自動変換を修復します。