목록 상자를 사용하여 시계열도에서 여러 변수의 루트 이름을 변경합니다.안녕하세요, 저는 사용자에게 태그 이름을 선택하고 해당 태그 이름을 루트로 갖는 여러 변수의 시계열 도표를 생성할 수 있는 기능을 제공하려고 합니다.
그러나 동적으로 업데이트하는 방법에 어려움을 겪고 있습니다.
목록 상자에는 태그 목록이 포함되어 있으며, 이 예에서는 플롯할 변수에 해당 태그 이름과 확장자 .PV, .ETARG 등이 추가됩니다.

변수 이름을 생성하기 위해 다음 명령문을 구문 분석합니다.
vars = {};
str = "Variables(
X( :Time ),
Y( :" || TAG || ".ETARG, Position (1) ),
Y( :" || TAG || ".LO, Position( 1 ) ),
Y( :" || TAG || ".PV, Position( 1 ) ),
Y( :" || TAG || ".UP, Position( 1 ) )
)";
vars = parse(str);그러면 그래프 빌더는 플롯할 고정 태그 대신 이를 참조합니다.
Eval Expr(
DataTable1<<GRAPH builder=""></GRAPH>
사용자가 변수의 루트 이름을 선택할 수 있는 목록 상자가 있습니다.
ChooseET = List Box( ( ET_TAG_LIST ),
maxSelected( 1 ),
onChange(
TAG = ChooseET << Get Selected;그러나 그래프 빌더의 변수 이름은 정적입니다. 이것을 동적으로 만들려면 어떻게 해야 합니까? 그래프 빌더 내에서 목록 상자를 표현식으로 만들어 보았지만 작동하지 않습니다.
목록 상자와 그래프 빌더는 할당 문 내에 있습니다. 이것이 무엇인지, 얼마나 관련성이 있는지 잘 모르겠습니다.
미리 감사드립니다. 전체 코드는 다음과 같습니다!
JMP App(
Set Name( "Application" ),
Set Description(
"An empty workspace for creating custom applications with one or more windows and scripts"
),
Auto Launch( 1 ),
Snap To Grid( 1 ),
Show Grid( 1 ),
Show Properties( 1 ),
Show Sources( 1 ),
Group By Category( 1 ),
Dashboard Mode( 0 ),
Parameters,
Tables(
DataTable1 = GuiTable(
Set Path( "" ),
Set Label( "Output Table" ),
Set Location( "Current Data Table" ),
Set Invisible( 0 )
)
),
Script(JSL Quote(// This script is executed when the application is run.
// Named objects have been created for the application modules
// (for example, "Module1") and the pre-defined object
// "thisApplication" refers to the application object itself.
// Variables and functions declared here are scoped to the
// Application namespace.
dt = Current data table();
ETSelected = "A04004DD";
TAG = ETSelected;;
vars = {};
str = "Variables(
X( :Time ),
Y( :" || TAG || ".ETARG, Position (1) ),
Y( :" || TAG || ".LO, Position( 1 ) ),
Y( :" || TAG || ".PV, Position( 1 ) ),
Y( :" || TAG || ".UP, Position( 1 ) )
)";
vars = parse(str);
show(vars);
PDChartproperties = "
{Legend Model(
3,
Properties( 0, {Line Color( 4 )}, Item ID( \!"" || TAG ||".ETarg\!", 1 ) ),
Properties( 1, {Line Color( 19 ), Marker Size( 1 )}, Item ID( \!"" || TAG ||".LO\!", 1 ) ),
Properties( 2, {Line Color( 53 )}, Item ID( \!"" || TAG ||".PV\!", 1 ) ),
Properties( 3, {Line Color( 19 ), Marker Size( 1 )},Item ID( \!"" || TAG ||".UP\!", 1 )
)
)}
";
props = parse(PDChartproperties);
show(props);
dt = Current Data Table();
ET_LIST = {};
ET_TAG_List = {};
For( i = N Col( dt ), i >= 1, i--,
ET_col = Column (dt, i) << Get Name ();
If(
(Col N Missing( Column( i ) ) / N Row()) != 1 &
Contains (ET_col, "ETarg"),
Insert Into(ET_LIST, ET_col);
);
);
Show (ET_LIST);
n = N Items( ET_LIST );
For( i = 1, i <= n, i++,
ETARG = ET_LIST[i] ;
NFull = Length(ETARG) ;
ETTAG = Left(ETARG,(NFull-6)) ;
Insert Into(ET_TAG_List, ETTAG);
);
Show(ET_TAG_List);
) ),
Allocate(
Module1 = Plan(
PreAllocate,
Script(JSL Quote(// This script is executed when a new module instance is
// created. The pre-defined object "thisModuleInstance" refers
// to the instance object, but other objects such as boxes and
// scripts have not yet been created. Variables declared here are
// scoped to the ModuleInstance namespace.
// This special function will receive parameters passed to CreateInstance()
OnModuleLoad({},
);
thisModuleInstance << Create Objects;
// After this point your module instance objects have been created
// and can be referred to by name (for example, "Button1").
ColList1Select=Function({this},{selectedIndices},
// This function is called when the List Box selection changes
selectedIndices = this << Get Selected Indices;
);
) ),
Allocate(
DataFilterContext1 = Data Filter Context Box();
Lineup2 = Lineup Box();
Report3 = Platform(
DataTable1,
Distribution(
Continuous Distribution(
Column( :A04004DD ET_DELTA Ratio )
),
SendToReport(
Dispatch(
{"A04004DD ET_DELTA Ratio"},
"1",
ScaleBox,
{Min( -5 ), Max( 5 ), Inc( 0.1 ), Minor Ticks( 0 )}
),
Dispatch(
{"A04004DD ET_DELTA Ratio"},
"Quantiles",
OutlineBox,
{Close( 1 )}
),
Dispatch(
{"A04004DD ET_DELTA Ratio"},
"Summary Statistics",
OutlineBox,
{Close( 1 )}
)
)
)
);
Report1 = Platform(
DataTable1,
Graph builder(
Size( 430, 370 ),
Show Control Panel( 0 ),
Fit to Window( "Maintain Aspect Ratio" ),
Variables(
X( :Time ),
Y( :ZZ ET Metric ),
Y( :A04004DD ET_Pass, Position( 1 ) ),
Y( :A04004DD ET_Pass Ave, Position( 1 ) )
),
Elements( Points( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 3 ) ) ),
SendToReport(
Dispatch(
{},
"Time",
ScaleBox,
{Min( 3675484152 ), Max( 3676021620 ),
Interval( "Day" ), Inc( 5 ), Minor Ticks( 0 )}
)
)
)
);
ChooseET = List Box( ( ET_TAG_LIST ),
maxSelected( 1 ),
onChange(
TAG = ChooseET << Get Selected;
If( N Items( TAG ) != 0,
Show( TAG );
);
) );
DataFilter1 = DataTable1 << Data Filter(
Local,
Add Filter(
columns( :Day ),
Display( :Day, Size( 0, 0 ), Height( 0 ) )
)
);
Report2 = Platform(
DataTable1,
gb = Eval(
Eval Expr(
DataTable1<<GRAPH builder=""></GRAPH>고급 통계 모델링Re: 목록 상자를 사용하여 시계열도에서 여러 변수의 루트 이름을 변경합니다.사실, 나는 다른 vlist 상자를 추가하고 onchange( 스크립트 내에서 여기에 배포를 추가하여 이 문제를 해결했습니다.
조언 해주셔서 감사합니다!
Re: 목록 상자를 사용하여 시계열도에서 여러 변수의 루트 이름을 변경합니다.안녕하세요. 덕분에 몇 가지 사항이 명확해졌고 책에 투자했습니다.
처음에 애플리케이션을 그래픽으로 구축했는데 Distribution이 lineup2에 중첩되어 있지만 Organize(reparent (Lineup2(ChooseET)) 문에 정의되어 있다고 생각합니다.
스크립트를 실행하면 이전 배포 'onchange'를 삭제하는 등 내가 원하는 거의 모든 작업을 수행하지만 라인업 상자에 중첩되지 않고 대시보드/애플리케이션 외부에 새 배포가 생성됩니다.
전체 스크립트를 첨부했습니다. 추가 정보를 주시면 감사하겠습니다. reparent/allocate 명령에 대한 참조 자료를 찾을 수 없습니다.</CODE></P></LINGO-BODY><LINGO-SUB id="lingo-sub-277091" slang="en-US" mode="NONE">Re: 목록 상자를 사용하여 시계열도에서 여러 변수의 루트 이름을 변경합니다.</LINGO-SUB><LINGO-BODY id="lingo-body-277091" slang="en-US" mode="NONE"><P><A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/18907" target="_blank">@스퍼튼</A> ,</P>
<P> </P>
<P>한 JMP 플랫폼에서 사용 가능한 메시지가 다른 플랫폼에서는 사용되지 않을 수도 있습니다. GraphBuilder 플랫폼을 사용하면 사용자가 UI를 통해 끌어서 놓아 변수를 추가하고 제거할 수 있습니다. 따라서 JSL은 GraphBuilderBox에 Add Variable() 및 Remove Variable()을 구현했습니다.</P>
<P> </P>
<P>배포에는 그러한 인터페이스가 없으므로 변수를 추가하고 제거하는 방법이 없습니다.도움말 메뉴에 있는 JMP 스크립팅 색인은 플랫폼에서 사용할 수 있는 메시지의 전부는 아니더라도 대부분을 표시합니다.메인 메뉴 > 도움말 > 스크립팅 색인 > 개체(왼쪽 상단 모서리 필드) > 배포.</P>
<P> </P>
<P>JSL을 사용하여 작업을 수행하는 방법에는 일반적으로 두 가지 이상이 있습니다.몇 가지 옵션은 다음과 같습니다.</P>
<P><STRONG>옵션</STRONG> : 배포 플랫폼을 배포를 생성하는 GraphBuilder로 변경하세요. 동일한 옵션이 없거나 동일하게 보이지 않습니다. 그러나 변수를 추가하고 제거할 수 있습니다.</P>
<PRE><CODE class=" language-jsl">gbdist =Graph Builder(
Size( 534, 456 ),
Show Control Panel( 0 ),
Variables( Y( :A04004DD ET_DELTA Ratio ) ),
Elements( Histogram( Y, Legend( 3 ), Counts( 1 ) ) )
);
옵션 : 배포용 컨테이너를 사용하십시오. 디스플레이에 자리 표시자가 있어야 합니다. 그런 다음 변수를 변경할 때 해당 컨테이너의 기존 분포를 삭제한 다음 새 분포를 추가합니다. 코드에서 정리할 항목이 있다고 말한 것을 기억하십시오. 제가 다 청소하진 않았어요.
코드에는 빈 컨테이너 Lineup2가 있습니다. Report3을 만들면 해당 상자 안에 중첩됩니다. 사실 LineupBox의 기능을 사용하지 않기 때문에 VListBox로 변경하겠습니다.
Lineup2 = Lineup Box();
Report3 = Platform(
DataTable1,
Distribution(
Continuous Distribution(
Column( :A04004DD ET_DELTA Ratio )
),
아래는 스크립트의 일부입니다 7_InteractiveDisplays.jsl 위해 쓰여진 JMP 스크립팅 언어의 JSL 동반 애플리케이션, 제2판 .
clear globals();
orig_dt = Open( "$SAMPLE_DATA/Fitness.jmp" );
cnt = 0; Chosen Columns={}; //initiate values
//----Refresh display script---------------------------
refresh_script = Expr(
Try(dist_vlist << delete);
If( (cnt > 0 & N Items( Chosen Columns ) >= 1),
show(Chosen Columns);
dist_vlist = VListBox(
orig_dist = orig_dt << Distribution( Column( Eval( Chosen Columns ) ), invisible )
); //end VListBox
result_ob << append( dist_vlist );
) //end If
); //end Expr
//----Action to take for Add-----------------------------
add_script = Expr(
cnt = cnt + 1;
listocols << Append( selcol << Get Selected );
);
//----Action to take for Remove -----------------------------
remove_script= Expr(
cnt = cnt + 1;
listocols << Remove Selected;
);
//_______________________________________________________________________________
//-----Dialog Window layout---------------------------------
dist_win = New Window( "Create Distributions",
H List Box(
selcol = Col List Box( All, width( 100 ), nlines( 6 ) ),
Lineup Box( N Col( 1 ), Spacing( 3 ),
Button Box( "Add Column >>", add_script ),
Button Box( "<< Remove Column", remove_script )
),
// listocols is a Col List Box
listocols = Col List Box( width( 100 ), nlines( 6 ),
OnChange( Chosen Columns = listocols << Get Items;
refresh_script;)
) //end listocols
), //end HListBox
Text Box( " " ),
result_ob = Outline Box( "Current Selections" )
);
나는 당신이 마감 기한이 있는 작업을 수행하고 있다는 것을 알고 있습니다. 하지만 이 스크립트를 사용해 보세요. 이 토론의 게시물에서 언급한 여러 기능의 예를 제공합니다. 두 번째 옵션인 배포판 추가 및 제거 방법을 제공합니다.
행운을 빌어요!
Re: 목록 상자를 사용하여 시계열도에서 여러 변수의 루트 이름을 변경합니다.정말 좋습니다. 감사합니다.
두 번째 시계열 플롯으로 구문을 반복했는데 제대로 작동합니다.
TAG 이름이 변경되면 배포 상자의 열을 변경하는 구문을 해결할 수 없습니다.
이것이 Distribution 객체에서 작동해야 합니까?
Eval( Eval Expr( Dstr3 << Remove Variable( {Expr( Column( dt, curr_TAG || " ET_DELTA Ratio" ) )} ) ) );
전체 스크립트를 첨부했습니다.
도움을 주셔서 다시 한번 감사드립니다. 거의 가라앉고 있어요!
Re: 목록 상자를 사용하여 시계열도에서 여러 변수의 루트 이름을 변경합니다.@스퍼튼 ,
내 PC의 테이블에서 실행되는 스크립트를 첨부했습니다.
JSL을 사용하지 않았기 때문에 발생한 오류일 수 있습니다.
curr_TAG = TAG[1];
TAG는 ListBox << 선택의 결과입니다. 목록을 반환하는 경우 목록의 첫 번째 항목을 가져와야 합니다.
아, 또 다른 문제는 ETARG 확장을 사용하여 생성된 테이블입니다.ETARG에서 ETarg로 전환한 코드가 오류의 다른 원인일 수 있습니다.
스크립트에는 주석 처리된 show(curr_TAG) 행이 있습니다. 주석을 해제하고 로그를 살펴보세요.
주석 처리된 몇 줄을 볼 수 있습니다. 어제 테스트하기 위해 생성한 테이블에 몇 가지 변수를 구성했습니다.
Re: 목록 상자를 사용하여 시계열도에서 여러 변수의 루트 이름을 변경합니다.안녕하세요. 다시 한번 감사드립니다. 일부 데이터가 포함된 모든 열이 포함된 테이블을 첨부했습니다.
하드코딩된 설명을 제거하고 이 작업을 수행할 방법에 대한 명확한 방법을 얻은 후에 권장한 대로 몇 가지 관리 작업을 수행하겠습니다.
귀하의 코드를 넣었지만 "jsl 인수는 'Concat'에 대한 액세스 또는 평가에서 문자여야 합니다."라는 오류가 발생했습니다.
문안 인사
웨인
Re: 목록 상자를 사용하여 시계열도에서 여러 변수의 루트 이름을 변경합니다.@스퍼튼
나는 당신의 코드를 보았습니다.스크립트에는 두 번째 GraphBuilder에 대한 핸들이 있습니다.사용할 데이터 테이블이 없었기 때문에 몇 가지 사항을 변경해야 했습니다.
귀하의 코드에는 하드코딩된 요소가 여러 개 있습니다. 제거하는 것이 좋습니다. 예:
- 보고서 X축 날짜 범위로 보내기
- 보고서 범례 항목으로 보내기(또는 유지해야 함)
시작 TAG가 하드코딩되어 있는 것 같습니다.그래서 시작 curr_TAG를 해당 값으로 설정했습니다.아래에서는 제거하고 GraphBuilderBox에 변수를 추가하는 JSL을 보여줍니다. GB 주위에 컨테이너를 두고 변경 시 GB를 제거한 다음 새 GB를 추가하는 것이 더 우아할 수 있다고 생각합니다.
몇 가지 의견으로 데이터 테이블에 항상 PV, LO, UP 열이 있을 것이라고 확신하시나요?꼭 확인해야 할 사항인가요?
앞서 언급했듯이 동일한 결과를 얻는 방법에는 여러 가지가 있습니다.행운을 빌어요!
curr_TAG = "A04004DD";
ChooseET = List Box( ( ET_TAG_LIST ),
maxSelected( 1 ),
onChange(
TAG = ChooseET << Get Selected;
If( N Items( TAG ) != 0,
Show( TAG );
gbb2 = Report(gb)[GraphBuilderBox(1)];
Eval( EvalExpr(gbb2 << Remove Variable({Expr(column(dt,curr_TAG||".ETARG")), Role("Y"), Position(1)} );
gbb2 << Remove Variable({Expr(column(dt,curr_TAG||".LO")), Role("Y"), Position(1)} );
gbb2 << Remove Variable({Expr(column(dt,curr_TAG||".PV")), Role("Y"), Position(1)} );
gbb2 << Remove Variable({Expr(column(dt,curr_TAG||".UP")), Role("Y"), Position(1)} );
));
curr_TAG = TAG[1];
//show(curr_TAG);
wait(0);
Eval( EvalExpr(gbb2 << Add Variable({Expr(column(dt,curr_TAG||".ETARG")), Role("Y"), Position(1)} );
gbb2 << Add Variable({Expr(column(dt,curr_TAG||".LO")), Role("Y"), Position(1)} );
gbb2 << Add Variable({Expr(column(dt,curr_TAG||".PV")), Role("Y"), Position(1)} );
gbb2 << Add Variable({Expr(column(dt,curr_TAG||".UP")), Role("Y"), Position(1)} );
));
);
);
) ;
Re: 목록 상자를 사용하여 시계열도에서 여러 변수의 루트 이름을 변경합니다.@스퍼튼 ,
아래는 사용자가 변수를 선택하면 보고서가 변경되는 목록 상자가 있는 애플리케이션의 스크린샷입니다. 이 예에서 모든 그래프는 미리 만들어져 있으며(탭 참조) select에 대한 작업은 표시되는 탭을 변경하는 것입니다. 귀하의 선택 작업은 현재 "태그"를 제거하고 새 태그를 추가하는 것입니다. 두 번째 GraphBuilderBox에 변수를 제거하고 추가하기 위한 메시지를 사용하여 완료될 것이라고 추측하고 있습니다.

애플리케이션을 << 실행에서 << 편집으로 변경하면,
ApplicationBuilder UI가 표시되어야 합니다. ListBox(cart_lb)가 강조 표시되고 빨간색 윤곽선은 선택 시 수행될 trh 작업에 대한 함수/스크립트를 추가할 위치를 보여줍니다.

다음은 이 애플리케이션의 ListBox에 대한 스크립트입니다.
Local({idx, nme, tList},
tlist = (cart_lb << get selected);
if(nitems(tlist) >0,
nme = tlist[1];
//show(nme);
idx = var_tabs << index of tab(nme);
var_tabs << set selected(idx);
//show(idx);
); //end if
); //end Local
이 애플리케이션에 명시된 대로 목록의 색인을 얻습니다. 탭은 목록과 정렬되므로 색인이 알려지면 관련 탭이 표시됩니다.
두 번째 GraphBuilder 디스플레이의 이름을 지정했는지 모르므로 스크립트에 도움을 드릴 수 없습니다. 예상되는 열 이름이 있는 데이터 테이블이 없기 때문에 귀하의 응용 프로그램을 시도하지 않았습니다.
어쩌면 이것은 당신에게 새로운 것이 아닙니다.만약을 대비해 몇 가지 단서를 제공하려고 합니다.
Re: 목록 상자를 사용하여 시계열도에서 여러 변수의 루트 이름을 변경합니다.응답해 주셔서 감사합니다.
나는 사용자가 여러 태그를 선택하도록 하고 싶지 않습니다. 목록에서 하나의 항목을 선택하면 응용 프로그램은 해당 태그를 이름의 루트로 사용하여 여러 열의 시계열 도표를 표시합니다.
따라서 TAG ABC123을 선택하면 시계열에 ABC123.ETARG, ABC123.UP, ABC123.LO 및 ABC123.PV가 표시됩니다.
Re: 목록 상자를 사용하여 시계열도에서 여러 변수의 루트 이름을 변경합니다.@스퍼튼 ,
이를 수행하는 방법에는 여러 가지가 있습니다. 선택하는 방법은 UI에 대해 기대하는 작업에 따라 다릅니다.
사용자는 목록에서 항목 1개를 선택한 다음 컨트롤을 사용하여 다른 항목을 선택하고 범위에 따라 Shift 키를 누른 다음 일부를 제거할 수 있습니다. 내 요점은 각 선택에 따라 보고서를 업데이트할 것인지, 아니면 버튼을 추가할 것인지입니다. 따라서 일단 선택하면 사용자는 Go, Rerun 또는 Do It 버튼을 눌러 분석을 다시 실행합니다.
GraphBuilder 보고서와 관련하여 그래프 빌더 상자에 변수를 추가하고 제거할 수 있습니다. 또는 사용자 선택을 제외한 모든 항목을 캡처하는 가시성이 축소인 제외 로컬 필터를 추가할 수 있습니다. 이는 Eval Expr 대신 옵션일 수 있습니다.JSL Companion 2nd Edition을 작성할 때 GraphBuilderBox 사용이 누락되었습니다.
이것이 어떻게 작동하는지 이해하려면 필터를 사용하여 그래프를 만들고 다양한 옵션을 시도해 보는 것이 좋습니다.
개인적으로 사용자가 하나만 선택할 수 없다면 여러 선택이 가능한 경우 작업을 시작하는 버튼을 좋아합니다.
귀하의 코드를 자세히 읽지는 않았지만 창 네임스페이스(예: window:GraphBuilderBox(2))를 사용하여 표시 상자를 참조하거나 (this<< parent) 등과 같은 관계를 설정할 수 있습니다.
따라서 원하는 것을 달성하기 위한 여러 옵션이 있으며 이는 보고서의 현재 트리 구조와 UI에서 원하는 동작에 따라 달라집니다.