동적 열 수식에 대한 몇 가지 통찰력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 스크립팅을 위한 스위스 군용 칼처럼 꼭 휴대해야 할 몇 가지 도구 중 하나입니다.
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 );