목록 상자를 사용하여 시계열 도표에서 여러 변수의 루트 이름 변경안녕하세요, 저는 사용자에게 태그 이름을 선택하고 해당 태그 이름을 루트로 갖는 여러 변수의 시계열 플롯을 생성할 수 있는 기능을 제공하려고 합니다.
그러나 동적으로 업데이트하는 방법에 대해 고민하고 있습니다.
목록 상자에는 태그 목록이 포함되어 있으며 플롯할 변수에는 이 예에서 해당 태그 이름과 확장자(.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;그러나 그래프 빌더의 변수 이름은 정적입니다. 이것을 동적으로 만들려면 어떻게 해야 합니까? 목록 상자를 그래프 빌더 내에서 표현식으로 만들려고 시도했지만 작동하지 않습니다.
목록 상자와 그래프 빌더는 allocate 문 내에 있습니다. 이것이 무엇이며 그것이 얼마나 관련이 있는지 잘 모르겠습니다.
미리 감사드립니다. 여기에 전체 코드가 있습니다!
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( script.
조언 해주셔서 감사합니다!
Re: 목록 상자를 사용하여 시계열 플롯에서 여러 변수의 루트 이름을 변경합니다.안녕하세요, 덕분에 몇 가지가 명확해졌고 책에 투자했습니다.
나는 처음에 응용 프로그램을 그래픽으로 만들었고 분포가 lineup2에 중첩되어 있다고 생각하지만 Organize(reparent (Lineup2(ChooseET) 문에 정의되어 있습니다.
내 스크립트를 실행하면 이전 배포 'onchange'를 삭제하는 등 내가 원하는 거의 모든 작업을 수행하지만 라인업 상자에 중첩되지 않고 대시보드/애플리케이션 외부에 새 배포를 생성합니다.
전체 스크립트를 첨부했습니다. 더 이상의 통찰력을 주시면 감사하겠습니다. 부모 재지정/할당 명령에 대한 참조 자료를 찾을 수 없습니다.</CODE></P></LINGO-BODY><LINGO-SUB id="lingo-sub-277091" slang="en-US">Re: 목록 상자를 사용하여 시계열 플롯에서 여러 변수의 루트 이름을 변경합니다.</LINGO-SUB><LINGO-BODY id="lingo-body-277091" slang="en-US"><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에 변수 추가() 및 변수 제거()를 구현했습니다.</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 << get selected 의 결과입니다. 목록을 반환하는 경우 목록의 첫 번째 항목을 가져와야 합니다.
오, 다른 문제는 ETARG 확장을 사용하여 생성된 테이블입니다.ETARG에서 ETarg로 변경한 코드는 다른 오류 원인일 수 있습니다.
스크립트에는 주석이 달린 행 show(curr_TAG) 이 있습니다. 주석을 해제하고 로그를 확인하십시오.
주석 처리된 몇 줄을 볼 수 있습니다. 어제 테스트하기 위해 생성한 테이블에 몇 가지 변수를 구성했습니다.
Re: 목록 상자를 사용하여 시계열 플롯에서 여러 변수의 루트 이름을 변경합니다.안녕하세요, 다시 한 번 감사드립니다. 일부 데이터가 있는 모든 열이 포함된 테이블을 첨부했습니다.
이 작업을 수행할 방법에 대한 명확한 방법이 있으면 권장한 대로 하드코딩된 명령문을 제거하고 일부 정리 작업을 수행하겠습니다.
코드를 넣었지만 "jsl 인수는 'Concat' 액세스 또는 평가에서 문자여야 합니다."라는 오류가 발생했습니다.
문안 인사
웨인
Re: 목록 상자를 사용하여 시계열 플롯에서 여러 변수의 루트 이름을 변경합니다.@스푸튼
나는 당신의 코드를 보았다.스크립트에는 두 번째 GraphBuilder에 대한 핸들이 있습니다.사용할 데이터 테이블이 없었기 때문에 몇 가지 사항을 변경해야 했습니다.
귀하의 코드에는 몇 가지 하드코딩된 요소가 있습니다. 예를 들어 제거하는 것이 좋습니다.
- 보고서 X축 날짜 범위로 보내기
- 보고 범례 항목으로 보내기(또는 유지 관리가 필요함)
시작 TAG가 하드코딩된 것 같습니다.그래서 시작 curr_TAG를 해당 값으로 설정했습니다.아래에서 제거할 JSL을 보여주고 GraphBuilderBox에 변수를 추가합니다. 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개를 선택한 다음 컨트롤을 사용하여 다른 항목을 선택하고 일정 범위를 유지한 다음 일부를 제거할 수 있습니다. 내 요점은 보고서가 각 선택 사항에 따라 업데이트되기를 원하는지 아니면 단추를 추가하여 선택하면 사용자가 이동 또는 재실행 또는 Do It 단추를 눌러 분석을 다시 실행하는 것입니다.
보고서 GraphBuilder와 관련하여 Graph Builder Box에 변수를 추가하고 제거할 수 있습니다. 또는 가시성이 사용자 선택을 제외한 모든 항목을 캡처하는 축소인 제외의 로컬 필터를 추가할 수 있습니다. Eval Expr 대신 옵션일 수 있습니다.JSL Companion 2nd Edition이 작성되었을 때 GraphBuilderBox 사용이 누락되었습니다.
필터로 그래프를 만들고 다른 옵션을 시도하여 이것이 어떻게 작동하는지 이해하는 것이 좋습니다.
개인적으로 사용자가 한 가지만 선택할 수 있는 것이 아니라면 여러 선택이 가능한 경우 작업을 시작하는 버튼이 마음에 듭니다.
코드를 자세히 읽지 않았지만 window:GraphBuilderBox(2) 같은 창 네임스페이스를 사용하여 표시 상자를 참조하거나 (this<< parent) 등과 같은 관계를 설정할 수 있습니다.
따라서 원하는 것을 달성할 수 있는 여러 옵션이 있으며 보고서의 현재 트리 구조와 UI에서 원하는 동작에 따라 다릅니다.