動的列数式に関する考察JSL 初心者の私は、スクリプトの解釈に苦労することがよくあります。ディスカッションで自分の問題に対処してくれそうなスクリプトを見つけてカスタマイズしようとすると、スクリプトが壊れてしまい、修正方法がわからなくなることがよくあります。JSL スクリプト作成の過程で、このフォーラムに大いに頼ってきました。過去の回答を膨大なアーカイブで検索したり、回答が明確でない場合は助けを求めたりしています。このフォーラムは JSL を学ぶための貴重なリソースであり、ここでの知識の深さと共有の意欲は素晴らしいです。
最近、動的列数式をいじっていて、数年前の非常に役立つ投稿をここで見つけました。 @txnelsonの解決策と、それに続く@NisKorsgaardの提案は、私にとって非常に啓発的でした。私は JSL に非常に不慣れなので、コードを「アンパック」して、各部分が何をするのかを理解することがよくあります。私は、動的列数式の問題に対してこれを行いました。この演習は私にとって非常に役立ちましたし、他の人にも役立つかもしれないと思ったので、以下に「アンパック」したコードを含めました。
このスクリプトは実用的なことは何もしませんが、列の数式を動的に変更する方法の簡単な例を提供します。誰かにとって役に立つことを願っています。
// CALL COLUMN BY REFERRING TO VARIABLE
// See this Discussion for more info:
// From: https://community.jmp.com/t5/Discussions/call-a-column-by-referring-to-variable/td-p/272339
// Original script from @txnelson
//Names Default To Here( 1 );
//dt = Open( "$SAMPLE_DATA/big class.jmp" );
//columnname1 = Column( dt, 4 ) << Get Name;
//columnname2 = Column( dt, 5 ) << Get Name;
//
//Eval(
// Substitute(
// Expr(
// dt << New Column( "new_" || columnname1,
// Numeric,
// continuous,
// formula( __c1__ + __c2__ )
// )
// ),
// Expr( __c1__ ), Parse( ":" || columnname1 ),
// Expr( __c2__ ), Parse( ":" || columnname2 )
// )
//);
// ==================================================
// REVISED SCRIPT
// Pulls apart the above script a bit. For me, this was easier to visualize
// and understand. Also helped clarify how variables work and why the
// EVAL EXPR function is needed. When running script look at the log for changing
// variable contents.
// SETUP
// **************************************************
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/big class.jmp" );
columnName1 = Column( dt, 4 ) << Get Name;
columnName2 = Column( dt, 5 ) << Get Name;
// FORMULA WITH PLACEHOLDERS
// Create expression with desired formula using placeholders for each variable and store result in var.
// **************************************************
var = Expr(
dt << New Column( "new_" || columnName1, Formula( __c1__ + __c2__ ) )
);
Show (var); // For learning and debugging. Look in log for value of var.
// SWAP OUT PLACEHOLDERS FOR COLUMN NAME STORED IN VARIABLES
// Replace placeholders with variable contents, make them column names and store result in subVar.
// To see the effect of EVAL EXPR, try substituting EVAL (remove EXPR) and re-running the script.
// Look at the log.
// **************************************************
subVar = Substitute(
Eval Expr( var ),
Expr( __c1__ ), As Name( columnName1 ),
Expr( __c2__ ), As Name( columnName2 )
);
Show( subVar); // For learning and debugging. Look in log for value of subVar.
// DO IT
// Make the column with the new formula.
// **************************************************
Eval( subVar );
自動化とスクリプトRe: 動的列数式に関する考察これは少し古い投稿ですが、Eval Insert、Eval Expr、Parse、および Substitute を使用して、ある式を別の式に挿入するための良い出発点です。十分な時間ができたら、これら (式といくつかの異なるケースでのそれらの処理) についての私の見解をブログ投稿として書きます。
Re: 動的列数式に関する考察@jthi 、式処理の基礎に関するこの入門コースをありがとうございます。
セッション 9: 上級 JSL 33 分 - ...
もう一つの素晴らしい講義:
JSL を使用した効率的で堅牢なアプリケーションの開発 (EU 2018 415)
Eval(Substitute()) は、 JSL スクリプト用のスイス アーミー ナイフのように携帯すべき数少ないツールの 1 つです : )
JMP での式の処理: Tipps と Trapdoors
Re: 動的列数式に関する考察列名を文字列として保存し、 as nameを介して「名前」に変換する代わりに、名前(「:」の有無にかかわらず)を保存し、 Name Exprを介して取得して保存することもできます。
dt = Open( "$SAMPLE_DATA/big class.jmp" );
col1 = Name Expr(:height);
col2 = Name Expr(:weight);
new name = "new_" || (col1 << get name);
col1 << set name("tmp"); // we don't care - the reference will still point to the right column
var = Expr(
dt << New Column( new name , Formula( __c1__ + __c2__ ) )
);
var = Substitute( Name Expr(var),
Expr( __c1__ ), Name Expr( col1 ),
Expr( __c2__ ), Name Expr( col2 )
);
/*alternative:
Substitute Into( var,
Expr( __c1__ ), Name Expr( col1 ),
Expr( __c2__ ), Name Expr( col2 )
);*/
Eval( var );