사용자 선택에 따라 업데이트되는 대화형 창 스크립팅 도움말여러분 모두에게,
배포 플랫폼을 호출하지 않고도 사용자에 대한 몇 가지 간단하고 빠른 통계를 수행하기 위해 조직의 사용자에게 배포할 스크립트를 작성 중입니다. 스크립트는 아래에 현재 가지고 있는 것의 스크린샷과 문제가 있는 것들의 목록이 나와 있습니다. 사용자는 JMP 16.1을 실행할 예정이고 저는 JMP Pro 16.0을 실행하고 있습니다. 모든 머신은 Windows 10, 64비트 머신입니다.
스크립트의 의도된 목적은 숫자 열(나중에 범주형 열을 다룰 것임)을 표시하는 것이며, 어떤 라디오 버튼이 선택되었는지에 따라 몇 가지 간단한 통계를 수행하고 Stats라는 열이 있는 동일한 창에 결과를 표시합니다. 계산된 통계 유형 및 해당 계산 결과의 값. 열 선택 패널 상자에서 적절한 열을 선택한 후 라디오 버튼을 선택하면 결과 패널 상자가 업데이트되어야 합니다.
현재 JMP 스크립트(참고로 익숙한 Big Class.jmp 파일에서 테스트 중입니다):
Names Default To Here( 1 );
//Clear Symbols();
//the width of the column list box in pixels
lbWidth = 100;
dt = Current Data Table();
//List of statistics to calculate
StatsListA = {"Mean", "Std Dev", "Max", "Min", "Range", "N"};
StatsListB = {"95% quantile", "50% quantile", "5% quantile"};
StatsListC = {};
//Expression to do math
MathA = Expr(
response_col = Column( dt, Eval( Eval Expr( Expr( ycols ) ) ) );
ymean = Col Mean( response_col );
ystdev = Col Std Dev( response_col );
ymin = Col Min( response_col );
ymax = Col Max( response_col );
yrange = ymax - ymin;
yN = Col Number( response_col );
NumResultsA = {ymean, ystdev, ymin, ymax, yrange, yN};
);
//Expresseion for other math
MathB = Expr(
);
ValueDlg = Expr(
nwin = New Window( "GUI for quick stats",
<<RETURN result=""></RETURN>
이것이 내가 지금까지 가지고 있는 것입니다:

제가 겪고 있는 문제의 목록은 다음과 같습니다.
- Radio Box()에 대한 호출은 실제로 계산될 통계를 나열하는 대신 로컬 변수 이름 "StatsListA" 등을 나열합니다. 예를 들어 첫 번째 라디오 버튼 뒤에는 Mean, Std Dev, Max, Min, Range, N 목록이 있어야 합니다. 이는 StatsListB 및 StatsListC에도 적용되어야 합니다(아직 C 목록을 정의하지 않았습니다). JSL 코드 상단에 만든 미리 정의된 목록을 평가하는 방법을 잘 모르겠습니다. 목록의 항목을 변경하고 싶을 수도 있고 매번 Radio Box() 호출을 편집하는 대신 로컬 변수 StatsListX를 변경하는 것이 더 쉽기 때문에 각 항목을 모두 작성할 필요가 없는 것을 선호합니다.
- 지금은 모든 열을 나열하지 않고 숫자만 나열하고 싶습니다. Col List Box()의 옵션을 All에서 Numeric("" 포함 또는 제외)으로 변경하면 빈 열 목록이 표시됩니다. 해당 옵션을 정의했을 때 숫자 열만 나열해야 하는데 왜 이런 일이 발생하는지 알 수 없습니다.
- 이것이 제가 생각하는 가장 어려운 문제입니다. 앞에서 언급했듯이 패널 상자 "결과"의 결과를 왼쪽 "통계" 열(StatsListX의 통계 및 이에 대한 계산 결과 나열)로 업데이트하고 싶습니다. 오른쪽 열 "값"에 통계가 있습니다. 이는 라디오 버튼을 클릭할 때마다 업데이트되어야 합니다. 따라서 원래 :height를 보고 있었지만 :weight를 보고 싶다면 :weight를 선택한 다음 라디오 버튼 중 하나를 클릭하여 관련 통계 요약을 가져옵니다. 여기에 표시된 Set Function 예제를 따라해 보았지만 성공하지 못했습니다(저는 Set Function 호출을 잘 모릅니다).

MathA의 Expr()은 원래 창을 닫고 결과가 포함된 새 창을 열어 호출되도록 의도되었지만 JMP 토론에서 좀 더 조사한 후 기존 창 내의 필드를 업데이트할 수 있다는 사실을 발견했습니다. 이것이 제가 이 문제에 접근하는 것을 선호하는 방식입니다. 따라서 내 코드 상단에 있는 원래 코딩이 내가 하려는 작업에 적합한 코드가 아니라는 것을 알고 있습니다.
이에 대한 도움을 주시면 감사하겠습니다.
감사해요!,
DS
품질 및 프로세스 엔지니어링Re: 사용자 선택에 따라 업데이트되는 대화형 창 스크립팅 도움말정말 깔끔해요. 이 토론에 감사드립니다.
Re: 사용자 선택에 따라 업데이트되는 대화형 창 스크립팅 도움말안녕하세요 여러분,
귀하가 지속적으로 제안하는 변경사항에 대해 감사드립니다. 스크립트를 일부 변경했으며 최신 수정 버전이 더 마음에 들기 때문에 다른 사람의 기여에 정말 감사드립니다. 업데이트된 스크립트는 이 답변 끝에 게시됩니다. 이 새로운 스크립트는 문자 데이터 유형에 대한 요약 통계도 제공합니다. 패널 레이아웃도 약간 수정했습니다.
@jthi , 귀하의 제안이 매우 좋다고 생각하여 이를 반영했습니다. 결과 통계에 대한 색상 헤더 이름이 마음에 듭니다. 또한, 무엇과 비슷합니까? @ErraticAttack 코드에 새 열을 선택하거나 새 수치 결과를 선택하면 통계가 업데이트되도록 만들었습니다. Big Class.jmp 데이터 테이블처럼 레벨이 많을 수 있으므로 캐릭터 통계 결과의 세로 크기를 변경하도록 허용했습니다. 해당 열 유형으로 변경하면 범주형 통계도 업데이트되지만, 문자 열을 선택한 다음 누군가가 숫자 통계 옵션을 클릭하면 오류가 발생합니다. 창 너비 크기가 계속 변경되지 않도록 너비 제안을 유지했습니다. 죄송합니다 @ErraticAttack , 저는 현재 새로운 네임스페이스를 정의하는 방법과 코드를 수정하는 방법에 대해 잘 알지 못합니다. 매우 유용하고 사물에 접근하는 좋은 방법인 것 같습니다. 올바르게 수행하는 방법을 배워야 합니다.
나는 이 문제, 특히 미적 측면을 개선하는 방법에 대한 다른 제안이 있을 것이라고 확신합니다. 그렇다면 게시해 주세요. 단, 이 토론에 대한 업데이트가 있음을 알 수 있도록 저를 태그해 주세요. 개선 사항을 제안해 주신 모든 분들께 다시 한번 감사드립니다.
감사해요!,
DS
아래
//GUI for quickly reporting statistics written by D. Schmidt, ver1.5
//Thanks to JMP User community members: jthi, ian_jmp, and ErraticAttach for helpful suggested changes.
Names Default To Here( 1 );
Clear Symbols();
//the width of the column list box in pixels
lbWidth = 217;
dt = Current Data Table();
//dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
//List of statistics to calculate
StatsList1 = {"µ", "σ", "Max", "Min", "Range(Δ)", "N"};
StatsList2 = {"Quantiles", "5%", "25%", "50%", "75%", "95%"};
StatsList3 = {"N", "N Missing", "N 0", "Prop 0", "Prop non-0"};
maxStatCount = Max( N Items( StatsList1 ), N Items( StatsList2 ), N Items( StatsList3 ) );
//RadioBox() arguments
rbArg = Eval List( {Concat Items( StatsList1, ", " ), Concat Items( StatsList2, ", " ), Concat Items( StatsList3, ", " )} );
rbcArg = {"Select for categorical columns"};
//Statistics to Calculate
statMean = Expr( Col Mean( tempCol ) );
statStd = Expr( Col Std Dev( tempCol ) );
statMax = Expr( Col Max( tempCol ) );
statMin = Expr( Col Min( tempCol ) );
statRange = Expr(
Col Max( tempCol ) - Col Min( tempCol )
);
statN = Expr( Col Number( tempCol ) );
statQ95 = Expr(
Col Quantile( tempCol, 0.05 )
);
statQ75 = Expr(
Col Quantile( tempCol, 0.25 )
);
statQ50 = Expr(
Col Quantile( tempCol, 0.5 )
);
statQ25 = Expr(
Col Quantile( tempCol, 0.75 )
);
statQ5 = Expr(
Col Quantile( tempCol, 0.95 )
);
statMiss = Expr(
Col N Missing( tempCol )
);
statZero = Expr(
N Items( Loc( tempCol << get as matrix, 0 ) )
);
statProp0 = Expr( statZero / statN );
statPropn0 = Expr( 1 - statProp0 );
CatStats = Expr(
coltype = tempCol << Get Data type;
If( coltype == "Character",
catdist = dt << Distribution( Nominal Distribution( Column( tempCol ) ), Invisible );
rpt_catdist = catdist << Report;
lvl = rpt_catdist[String Col Box( 1 )] << Get;
Count = rpt_catdist[Number Col Box( 1 )] << Get;
Prob = rpt_catdist[Number Col Box( 2 )] << Get;
SummNMiss = rpt_catdist[List Box( 7 )][2] << Get Text;
SummLvl = rpt_catdist[List Box( 8 )][1] << Get text;
numNMiss = Num( SummNMiss );
numLvl = Num( SummLvl );
catdist << Close Window;
);
Insert Into( lvl, {"N Missing", "N Levels"} );
Insert Into( Count, numNMiss );
Insert Into( Count, numLvl );
);
//List for results
StatList = Eval List( {StatsList1, StatsList2, StatsList3} );
StatListRes1 = Expr(
Eval List( {statMean, statStd, statMax, statMin, statRange, statN} )
);
StatListRes2 = Expr(
Eval List( {., statQ95, statQ75, statQ50, statQ25, statQ5} )
);
StatListRes3 = Expr(
Eval List( {statN, statMiss, statZero, statProp0, statPropn0} )
);
StatListRes = Expr(
Eval List( {StatListRes1, StatListRes2, StatListRes3} )
);
//User window
ValueDlg = Expr(
nwin = New Window( "GUI for quick stats",
<<RETURN result=""></RETURN>
Re: 사용자 선택에 따라 업데이트되는 대화형 창 스크립팅 도움말안녕 @jimloughlin ,
제 생각에는 그것은 단지 디버깅 코드였던 것 같습니다. @jthi 내가 게시한 원본 코드에 대한 제안된 편집 내용을 제공할 때 사용하고 있었습니다. 나는 이 스레드에 글을 쓴 다른 사람들이 제안한 일부 수정 사항을 고려하여 업데이트된 내용을 게시하고 있습니다. 업데이트된 스크립트를 게시하면 태그하겠습니다. Big Class.jmp 데이터 테이블에서는 제대로 작동합니다.
감사해요!,
DS
Re: 사용자 선택에 따라 업데이트되는 대화형 창 스크립팅 도움말여기에 내 두 센트를 던지고 있습니다.가능한 한 스크립트를 논리적으로 격리된 단위나 기능으로 분리하는 것이 가장 좋습니다.이를 위해서는 디스플레이 트리에서 로직을 제거하고 함수 정의를 최대한 단순하게 만드는 것이 훨씬 더 낫다는 것을 알았습니다.
아래 예제 솔루션에서는 모든 기능의 범위가 본인 네임스페이스와 각 함수의 첫 번째 줄은 본인 네임스페이스.실제로 내가 한 일은 이 작업을 자동으로 수행하는 메타 프로그래밍 래퍼를 만들어 명시적으로 정의할 필요가 없도록 하는 것입니다. 본인 네임스페이스를 포함하거나 self = 네임스페이스( "이름" ) line을 각 함수의 첫 번째 인수로 사용합니다.대화형 GUI를 많이 생성하는 경우 많은 작업을 절약할 수 있으므로 비슷한 작업을 수행하는 것이 좋습니다.이는 또한 스크립트를 다음과 같이 래핑할 필요가 없다는 이점도 있습니다. 평가( 평가 Expr( "<CODE>" ) ) 차단하다.
또한 이 경로를 따라가면 직접 호출할 수 있는 내장 디스플레이 상자용 래퍼를 생성하는 것이 가장 쉬운 방법이라는 것을 알았습니다. 본인 기능을 제공하므로 너무 많은 상용구를 넣을 필요가 없습니다. << 함수 설정() 메시지.
/* quick stats */
self = New Namespace();
self:tool name = "Quick Stats";
Eval( Eval Expr(
self:initialize = Function( {}, // called before the display tree is generated
self = Namespace( Expr( self << Get Name ) );
self:table = Current Data Table();
self:radio inputs = {
"Mean, Std Dev, Max, Min, Range, N",
"Quantiles: 0.05, 0.25, 0.50, 0.75, 0.95",
"N, N Missing, N Zero, Prop 0, Prop non-0"
};
self:stat list = {
{"Mean", "Std Dev", "Max", "Min", "Range", "N"},
{"5%", "25%", "50%", "75%", "95%"},
{"N", "N Missing", "N Zero", "Prop 0", "Prop non-0"}
};
1
);
self:content = Function( {}, // holds the display tree
self = Namespace( Expr( self << Get Name ) );
self:container = H Splitter Box(
V List Box(
H List Box(
Lineup Box( N Col( 1 ), Spacing( 0 ),
Spacer Box( <<SET auto="" stretching=""></SET>self:window << Update Window;
self:finalize();
) );
self << Get Name;
Re: 사용자 선택에 따라 업데이트되는 대화형 창 스크립팅 도움말statsstart.jcl을 실행하면 다음 오류가 발생합니다.
이름이 확인되지 않음: 'tempCol' , tempCol/*###*/ 액세스 또는 평가 시 tempCol{1}
아마도 v13.2.1을 실행하고 있기 때문일까요?
Re: 사용자 선택에 따라 업데이트되는 대화형 창 스크립팅 도움말스크립트가 원하는 대로 작동하게 된 후에는 시각적으로 고려해야 할 몇 가지 사항이 있습니다.
- 테이블 크기가 변경되고 창이 약간 "바운스"됩니다.
- 사용자가 선택한 열이 없으면 오류가 발생합니다.
- 열려 있는 데이터 테이블이 없으면 스크립트 실행을 중지하고 사용자에게 알릴 수 있습니다.
- 사용자가 Col List Box의 열을 변경하는 경우 현재 선택한 Radio Box로 통계를 다시 계산하거나 테이블을 비워야 합니다.
몇 가지 아이디어:
- 결과 패널 상자의 경우. 너비 설정을 사용하여 테이블의 가로 크기 변경을 방지하고 사전 정의된 목록 크기가 있는 숨겨진 자리 표시자 문자열 열 상자를 사용하여 세로 크기 변경을 방지할 수 있습니다.
- 열 패널 상자를 선택합니다. 사용자가 여러 열을 선택하지 못하도록 Max Selected(1)를 추가할 수 있습니다.
- 빠른 통계 패널 상자를 선택합니다. 사용자가 선택한 열이 없는 경우 일종의 "오류 처리"입니다.
일부 수정 사항이 포함된 전체 스크립트:
더보기...
Re: 사용자 선택에 따라 업데이트되는 대화형 창 스크립팅 도움말안녕 @jthi 그리고 @ian_jmp ,
큰 도움을 주신 두 분 모두 감사드립니다! 마지막 두 가지 힌트를 주셔서 감사합니다. @jthi , 연관배열 알파벳순 "문제"를 극복할 수 있었습니다. 나는 AA의 힘을 좋아하고 그것이 어디에 도움이 될 수 있는지 알지만 사용자 때문에 유지하려면 특정 순서가 필요합니다.
제가 겪었던 Count Zero 문제에 대한 목록 제안과 귀하의 제안을 통해 변경할 수 있었습니다. 감사해요! 코드가 예상대로 작동하므로 이제 범주형 열을 수행하기 위해 코드를 확장한 다음 사용자를 대상으로 설문조사를 실시하여 필요한 실제 통계 목록이 무엇인지 확인해야 합니다.
모든 도움에 다시 한번 감사드립니다! 작업 코드(적어도 숫자 열의 경우)는 다음과 같습니다.
감사해요!,
DS
Names Default To Here( 1 );
Clear Symbols();
//the width of the column list box in pixels
lbWidth = 205;
dt = Current Data Table();
//dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
//List of statistics to calculate
StatsList1 = {"Mean", "Std Dev", "Max", "Min", "Range", "N"};
StatsList2 = {"Quantiles", "5%", "25%", "50%", "75%", "95%"};
StatsList3 = {"N", "N Missing", "N Zero", "Prop 0", "Prop non-0"};
//Statistics to Calculate
statMean = Expr( Col Mean( tempCol ) );
statStd = Expr( Col Std Dev( tempCol ) );
statMax = Expr( Col Max( tempCol ) );
statMin = Expr( Col Min( tempCol ) );
statRange = Expr(
Col Max( tempCol ) - Col Min( tempCol )
);
statN = Expr( Col Number( tempCol ) );
statQ95 = Expr(
Col Quantile( tempCol, 0.05 )
);
statQ75 = Expr(
Col Quantile( tempCol, 0.25 )
);
statQ50 = Expr(
Col Quantile( tempCol, 0.5 )
);
statQ25 = Expr(
Col Quantile( tempCol, 0.75 )
);
statQ5 = Expr(
Col Quantile( tempCol, 0.95 )
);
statMiss = Expr(
Col N Missing( tempCol )
);
statZero = Expr(
N Items( Loc( tempCol << get as matrix, 0 ) )
);
statProp0 = Expr( statZero / statN );
statPropn0 = Expr( 1 - statProp0 );
//RadioBox() argument
rbArg = Eval List( {Concat Items( StatsList1, ", " ), Concat Items( StatsList2, ", " ), Concat Items( StatsList3, ", " )} );
//List for results
StatList = Eval List( {StatsList1, StatsList2, StatsList3} );
StatListRes1 = Expr(
Eval List( {statMean, statStd, statMax, statMin, statRange, statN} )
);
StatListRes2 = Expr(
Eval List( {., statQ95, statQ75, statQ50, statQ25, statQ5} )
);
StatListRes3 = Expr(
Eval List( {statN, statMiss, statZero, statProp0, statPropn0} )
);
StatListRes = Expr(
Eval List( {StatListRes1, StatListRes2, StatListRes3} )
);
//User window
ValueDlg = Expr(
nwin = New Window( "GUI for quick stats",
<<RETURN result=""></RETURN>Re: 사용자 선택에 따라 업데이트되는 대화형 창 스크립팅 도움말1. 연관 배열을 사용하기 때문에 통계가 다시 정렬됩니다. 목록을 사용하고 참조를 수정하여 인덱스를 사용할 수도 있습니다.
2. 0 값을 계산하는 방법을 수정하면 효과가 있을 수 있습니다. 예를 들어 N Items()와 함께 Loc() 예제를 사용할 수 있습니다.
statZero = Expr(N Items(Loc(tempCol << get as matrix, 0)));

Re: 사용자 선택에 따라 업데이트되는 대화형 창 스크립팅 도움말안녕 @jthi 그리고 @ian_jmp ,
빠른 피드백 주신 두 분 정말 감사드립니다! 귀하의 제안은 큰 효과가 있었고 저는 훨씬 더 많은 발전을 이룰 수 있었습니다. 이제 매우 간단한 두 가지 문제에 문제가 있습니다. 아래에 업데이트된 코드가 포함되어 있습니다. 참고로 :height에서 일부 값을 삭제하고 :height에 0을 추가하여 테스트했습니다.
문제:
- 통계를 나열할 때 알파벳 순서로 나열합니다. 목록에 정의한 순서를 유지하고 싶은데 가능합니까?
- 먼저 0의 개수를 세어 0과 0이 아닌 비율을 계산하려고 합니다. 불행히도 제대로 작동하지 않습니다. Expr() 내에 요약을 넣을 수 있지만 연관 배열을 정의할 수 없으며 후속 계산이 제대로 이루어지지 않습니다. 이 작업을 수행하는 더 쉬운 방법이 있다고 확신하지만 JSL에서 0만 계산하는 직접적인 명령을 찾을 수 없습니다. 누락된 값 5개와 0 값 7개를 수동으로 입력했습니다. 따라서 0이 아닌 소품은 0.8이어야 하고 0이 아닌 소품은 0.2가 되어야 합니다.
Names Default To Here( 1 );
Clear Symbols();
//the width of the column list box in pixels
lbWidth = 205;
dt = Current Data Table();
//dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
//List of statistics to calculate
StatsListA = {"Mean", "Std Dev", "Max", "Min", "Range", "N"};
StatsListB = {"Quantiles", "5%", "25%", "50%", "75%", "95%"};
StatsListC = {"N", "N Missing", "N Zero", "Prop 0", "Prop non-0"};
//RadioBox() argument
rbArg = Eval List( {Concat Items( StatsListA, ", " ), Concat Items( StatsListB, ", " ), Concat Items( StatsListC, ", " )} );
//Statistics to Calculate
statMean = Expr( Col Mean( tempCol ) );
statStd = Expr( Col Std Dev( tempCol ) );
statMax = Expr( Col Max( tempCol ) );
statMin = Expr( Col Min( tempCol ) );
statRange = Expr(
Col Max( tempCol ) - Col Min( tempCol )
);
statN = Expr( Col Number( tempCol ) );
statQ95 = Expr(
Col Quantile( tempCol, 0.05 )
);
statQ75 = Expr(
Col Quantile( tempCol, 0.25 )
);
statQ50 = Expr(
Col Quantile( tempCol, 0.5 )
);
statQ25 = Expr(
Col Quantile( tempCol, 0.75 )
);
statQ5 = Expr(
Col Quantile( tempCol, 0.95 )
);
statMiss = Expr(
Col N Missing( tempCol )
);<BR /><BR />//Here's where I'm having trouble with the N Zero and proportions zero and non-zero.
Expr(
Summarize( dt, eg = By( tempCol ), em = Count( tempCol ) )
);
PropTemp1 = Expr(
Associative Array( eg, em )
);
statZero = Expr( PropTemp1["0"] );
statProp0 = Expr( statZero / statN );
statPropn0 = Expr( 1 - statProp0 );
maths = Associative Array();
maths["StatListA"] = Associative Array( StatsListA, {statMean, statStd, statMax, statMin, statRange, statN} );
maths["StatListB"] = Associative Array( StatsListB, {., statQ95, statQ75, statQ50, statQ25, statQ5} );
maths["StatListC"] = Associative Array( StatsListC, {statN, statMiss, statZero, statProp0, statPropn0} );
rbOptions = maths << Get Keys;
//User window
ValueDlg = Expr(
nwin = New Window( "GUI for quick stats",
<<RETURN result=""></RETURN>
지금까지 도와주셔서 다시 한번 감사드리며, 다른 작은 일에도 도움을 주실 수 있기를 바랍니다.
감사해요!,
DS
Re: 사용자 선택에 따라 업데이트되는 대화형 창 스크립팅 도움말1번 항목과 관련하여 답변에 약간만 추가합니다. @jthi , 넌 할 수있어:
Names Default To Here( 1 );
//the width of the column list box in pixels
lbWidth = 100;
dt = Open("$SAMPLE_DATA/Big Class.jmp");
//List of statistics to calculate
StatsListA = {"Mean", "Std Dev", "Max", "Min", "Range", "N"};
StatsListB = {"95% quantile", "50% quantile", "5% quantile"};
//RadioBox() argument
rbArg = EvalList({ConcatItems(StatsListA, ", "), ConcatItems(StatsListB, ", ")});
//Window
New Window( "GUI for quick stats",
Panel Box( "Select Columns", ColListData = Col List Box( dt, all, <<SET data="https://community.jmp.com/" type=""></SET>
Re: 사용자 선택에 따라 업데이트되는 대화형 창 스크립팅 도움말몇 가지 간단한 테스트를 수행하고 스크립트를 첨부했습니다. 이에 접근하는 방법에 대한 아이디어가 있지만 최선의 해결책은 아닐 수도 있습니다.
1. 연관 배열 및 표현식으로 처리됩니다.
2. ColListData = Col List Box(dt, All, <
3. Set Function은 Evals를 사용하여 이를 처리합니다.
첨부된 스크립트는 제가 지금 이 문제에 접근하는 방법에 대한 가장 좋은 아이디어를 제공할 것입니다.
