강력한 열 참조JSL로 몇 분 동안 코딩한 후 사용자는 :섹스 와 같은 이상한 객체에 대해 궁금해합니다.
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
x = :sex
전문 사용자는 이러한 열 참조에 대한 어느 정도 경험이 있으며 항상 이를 사용합니다.
그런데 :sex는 뭔가요? dt:sex가 더 강력한가요? 관련 문서는 어디서 찾을 수 있나요?
통찰력을 모아 공유해 봅시다. 여러분의 생각을 추가해 주시고, 제 글에 오류가 있으면 수정해 주세요...
내 생각:
자동화 및 스크립팅Re: 견고한 컬럼 참조JSL에서 `:sex` (또는 `dt:sex` )라는 하나의 열 참조는 두 가지 방식으로 사용될 수 있습니다.
# 1) 열을 참조하는 경우
:sex << get name;
Data Table( "Big Class Families" ) << Distribution( Nominal Distribution( Column( :sex ) ));
... 그리고 #2
다음과 같이 해당 열에서 현재 행의 항목을 검색합니다.
[수정]: 아니요!
"열 수식에 사용되며, 일반적으로 '현재 행의 값'으로 생각할 수 있습니다."
하지만 이와 같은 유형의 성관계가 필요한 경우는 훨씬 더 많습니다.
</CODE></PRE>
<BR />
<P>참고: 열 수식에서 다음 두 가지 접근 방식은 동일합니다.</P>
<PRE><CODE class=" language-jsl">new column("s", formula (:sex));
new column("s", formula (:sex[]));
new column("s", formula (:sex[row()]))
row()=5;
s=:sex; // value of the current row
// other cases:
lag(:sex,1); // value of the previous row
Col Mean(:height, :age)); // mean :height of rows with same :age
문자열로부터 그러한 객체를 생성하는 방법에는 두 가지가 있습니다.
column name = "sex";
col= Column (column name); // for the first one (accessing the column)
val = As Column (column name) // for the second one (accessing the column in formulas)
사실, 제가 @jthi 님 에게서 배운 아주 멋진 세 번째 방법이 있어요.
the universal column reference = Name Expr(As Column(column name))
`:SX` 처럼 두 가지 접근 방식 모두에 사용할 수 있습니다. 열을 참조하거나 현재 행의 항목에 접근하는 데 사용할 수 있습니다.
Column() vs As Column() vs datable:column vs dt:As name("column")
Re: 강력한 열 참조:sex가 취약해 보입니다. 사용자가 열 이름을 변경하면 어떻게 되나요?
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
x = Name Expr(As column("name"));
Show(Name Expr(x)); // : name
:name << set name("The name");
Show(Name Expr(x)); // :The name
와, 멋지네요! 전혀 깨지기 쉽지 않네요!
Re: 강력한 열 참조사용자가 데이터 테이블을 변경하면?
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
x = Name Expr(As column("name"));
Show(Name Expr(x));
x[1] = "Marker";
:name << set name("The name");
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
Show(Name Expr(x));
Show(x[1])
무고한 :sex는 그것이 실제로 어떤 데이터 테이블에 속하는지 알고 있습니다. 대단하죠!
Re: 강력한 열 참조이제 1열에서 2열로 넘어가 보겠습니다.
myList1 = {:name,:sex,:age};
이 목록을 만드는 매우 복잡하고 쓸모없는 방법은 다음과 같습니다.
myList2 = Eval List({Name Expr(As column(:name)),Name Expr(As column(:sex)),Name Expr(As column(:age))});

Re: 강력한 열 참조쓸모 없는?
위의 코드를 실행하려고 하면 큰 차이가 있다는 것을 이미 알고 계실 것입니다.
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
첫 번째 줄은 공개 데이터 테이블이 없다는 사실을 신경 쓰지 않습니다. 두 번째 줄을 실행하면 JMP에서 다음과 같이 경고합니다.

더 좋은 점은 두 번째 방법으로 목록을 만들면 열 참조가 매우 강력해진다는 것입니다.
현재 데이터 테이블과 상관없이 JMP는 디티 로 이동하여 해당 열을 사용합니다.
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
myList1 = {:name,:sex,:age};
myList2 = Eval List({Name Expr(As column(:name)),Name Expr(As column(:sex)),Name Expr(As column(:age))});
dt2= Open( "$SAMPLE_DATA/Big Class Families.jmp" );
dt << Select Rows( [1] ) << Delete Rows; // now dt starts with Louise - there is no Katie anymore!
Show(Eval List(myList1), // Katie? why Katie!!!
Eval List(myList2)); // Louise -> works!

어떻게 작동하나요?
Show(Type(myList1[1]), Type(myList2[1]))
더 많은 통찰력을 제공합니다:

간단한 목록( 마이리스트1 )에는 "N 에임스 ", *)가 포함되어 있습니다.
복잡한 리스트( 마이리스트2 )에는 " 열 "가 포함되어 있습니다. **)
*) 이름이 평가될 때 JMP는 해당 이름의 의미를 결정하기 위해 특정 규칙을 따릅니다.
https://www.jmp.com/support/help/ko/19.0/#page/jmp/rules-for-resolving-names.shtml
JMP는 역할 중에서 현재 데이터 테이블 ( 디티2 )에서 열을 검색합니다.
**) 열의 경우 JMP는 데이터 테이블(" 디티 ")로 가서 열에 액세스하기만 하면 됩니다.
매우 튼튼해요!
Re: 강력한 열 참조Name Expr(As column(:col))
너무 멋지다!
Re: 강력한 열 참조Column()은 다양한 상황에서 작동하며 열 이름의 형식과 관련하여 매우 유연합니다.
Distribution(
Continuous Distribution( Column( :Random Normal )),
Continuous Distribution( Column( "Random Normal" )),
Continuous Distribution( Column( :"Random Normal"n )),
Continuous Distribution( Column( "Random Normal"n )),
Process Capability( 0 ) )
Re: 강력한 열 참조흥미로운 점은 열 목록을 요청하면 JSL 함수가 열 목록이 아닌 이름 목록을 반환한다는 것입니다 !
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
colList = Eval List({Name Expr(As column("sex"))});
write(Name Expr(colList[1]), " is a ", // :sex
Type(Name Expr(colList[1])), "\!n"); // Column -> universal & robust
selectedCols = dt << select columns (:sex) << get selected columns;
write(Name Expr(selectedCols[1])," is a ", // : sex
Type(Name Expr(selectedCols[1])), "\!n"); // Name -> fragile
dt << Group Columns(Item Range( :sex, :height ),"myColGroup");
colsFromColumnGroup = dt << get column group("myColGroup");
Write(Name Expr(colsFromColumnGroup[1]), " is a ", // :sex
Type(Name Expr(colsFromColumnGroup[1])), "\!n"); // Name -> fragile

열 이름 가져오기() 와 열 참조 가져오기() 의 차이점은 다음과 같습니다.
ColNames = dt << get column names; // default setting: returns names, not Strings
Write(Name Expr(ColNames[3]), " is a ", // sex (more or less the same as :sex)
Type(Name Expr(ColNames[3])), "\!n"); // Name -> fragile
ColRefs = dt << get column references;
Write(Name Expr(ColRefs[3]), " is a ", // Column("sex"
Type(Name Expr(ColRefs[3])), "\!n"); // Column -> robust, but not :sex, see below

이제 열을 가지고 놀다가 행 1의 :섹스 값을 물어보겠습니다.
//hide the column
:sex << set name("hidden");
// who finds it?
row()=1;
Try(Show(Eval(ColList[1])), print(exception_msg));
Try(Show(Eval(colsFromColumnGroup[1])), print(exception_msg));
Try(Show(Eval(selectedCols[1])), print(exception_msg));
Try(Show(Eval(ColNames[3])), print(exception_msg));
Try(Show(Eval(ColRefs[3])), print(exception_msg));

Re: 강력한 열 참조핵심 메시지:
학습을 통해
myList2 = Eval List({Name Expr(As column(:name)),Name Expr(As column(:sex)),Name Expr(As column(:age))});
JMP에서 제공하는 모든 목록을 다음을 통해 강력한 열 목록으로 변환할 수 있습니다.
ColNames = dt << get column names;
colList = Transform Each({col}, ColNames, Name Expr(As Column (col)));
Re: 강력한 열 참조
@바이런_JMP wrote:
Column()은 다양한 상황에서 작동하며 열 이름의 형식과 관련하여 매우 유연합니다.
Distribution(
Continuous Distribution( Column( :Random Normal )),
Continuous Distribution( Column( "Random Normal" )),
Continuous Distribution( Column( :"Random Normal"n )),
Continuous Distribution( Column( "Random Normal"n )),
Process Capability( 0 ) )
안녕하세요 @바이런_JMP , 분포() 내부의 Column()을 사용하면 많은 재미를 볼 수 있습니다.
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Distribution(Continuous Distribution( Column( :height )) );
Distribution(Continuous Distribution( Column( "height")) );
열 참조, 이름, 심지어 문자열까지! 모두 가능합니다.
... 분포 명령 외부에서 정의된 열을 사용하려고 할 때까지:
col = Column("height");
Show(col); // shows: it's a column
Distribution(Continuous Distribution(col));
Distribution(Continuous Distribution(Eval(col)));
Distribution(Continuous Distribution(Name Expr(col)));
"모두 다 시도해 보자. 그 중 하나만 효과가 있을 거야"와 같은 난해한 표현 처리 요령을 모두 시도해 볼 수 있지만, 아무것도 효과가 없습니다!
항상 같은 힌트지만, 무슨 뜻일까요?!?

해결책은 매우 간단합니다. 하지만 잘못된 곳에서 찾으려고 하면 몇 시간이 걸릴 수도 있습니다.
열기 전에 스스로 해결책을 찾아보세요 
:mano_con_el_dedo_índice_apuntando_hacia_abajo:
더 보기...
Column( :height ) inside
연속 분포()
외모 like
열("높이") in
col = Column("높이");
But it is a
명명된 인수 - like
공식() in
새로운 열(수식(...)).
So the "obvious" solution is: keep the name of the named argument and place the column inside:
Distribution(Continuous Distribution(Column(col)));
Re: 강력한 열 참조제 접근 방식은 훨씬 더 단순합니다. 제가 생각하는 특정 목적에 맞춰 열 목록을 신중하게 구성합니다. 때로는 서로 다른 형식의 열 목록을 여러 개 만들기도 합니다.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
text = dt << Get Column Names();
quote = dt << Get Column Names( String );
colformat = dt << get column reference();
quote = dt << Get Column Names( String );
show(text, quote, colformat);
반환되는 값:
텍스트 = {이름, 나이, 성별, 키, 몸무게};
quote = {"이름", "나이", "성별", "키", "몸무게"};
colformat = {열("이름"), 열("나이"), 열("성별"), 열("키"), 열("몸무게")};
세 가지 중 하나는 일반적으로 작동합니다. eval(parse())를 사용해야 하는 경우에도 마찬가지입니다.
Re: 강력한 열 참조기본적으로 저도 동의합니다. 몇 가지 예방 조치를 취하면 이름은 그다지 위험하지 않습니다.
열 목록을 만든 후에 열의 이름을 바꾸는 것이 현명한 일인지에 대해 논쟁할 수 있고, 이전 이름이 더 이상 작동하지 않는다고 궁금해하거나 불평할 수도 있습니다.
두 개의 테이블을 다룰 때는 올바른 데이터 테이블이 현재 데이터 table()인지 확인해야 합니다.
열 이름도 마찬가지입니다.
JMP가 대문자와 공백이 포함된 열 이름을 올바르게 처리한다고 가정할 수 있습니다. [링크 찾기]
아니면 조심해서 몇 가지 규칙을 따르면 됩니다. (이름, 변수, 열 이름의 충돌 금지, 공백 사용 주의 등) 그러면 하루 대부분을 문제 없이 안전하게 보낼 수 있습니다.
Re: 강력한 열 참조안녕하세요 @바이런_JMP , 까다롭게 말씀드리자면...

열 이름 가져오기()는 이름 목록을 반환합니다 ; )
Re: 강력한 열 참조중요한 발견 - 방금 첫 번째 게시물 중 하나를 편집했습니다!
제 생각이 이해되기를 바랍니다. 적어도 @크레이지_헤일스 와 같은 일부 사용자에게는 말이죠.
아마도 이 사용자들도 나와 같은 놀라움/깨달음/기쁨을 공유할 것이고, 이것이 사실임을 확인시켜 주거나, 설명을 제공하거나, 수정을 해줄 것입니다.
지금까지 저는 현재 행의 값을 검색하는 방법으로 열(col)로 을 생각했습니다. 특히 "열 접근"을 위한 열(col) 과 비교했을 때 더욱 그렇습니다( Column(col) << get name과 같은 방식).
반대 의미는 다음과 같습니다.
:col을 " 현재 행의 값 "이 아닌 다른 값으로 사용한 다음, 변수로 대체하고 싶을 때는 As column()을 사용할 필요가 없고 대신 Column(col)을 사용해야 합니다.
[저는 또한 그 이름에 대해 당황했습니다.
열 () - 역행렬을 구하는 함수의 경우, 열이 아니라 현재 행의 값을 구한다는 말인가요 ? 농담하시는 겁니까?
또 다른 생각:
이런 경우에 열(col)로가 작동한다면, 그것은 단지 JMP가 사용자의 오류를 자동으로 수정하기 때문일 뿐이거나, 모두가 사용하지만 아무도 설명하지 않는 난해한 효과 때문일 것입니다. 예를 들어 Name expr(As column(col))과 같습니다.
그래서, 저는 다음을 알아낸 후로 매우 편안함을 느낍니다. ....]
이 해석은 틀렸을 가능성이 큽니다. 이는 JMP의 자동적인 작동으로 인해 발생하는데, 아마도 다음과 같은 아이디어가 뒤따를 것입니다.
column(col)은 열에 대한 접근을 제공합니다.
( Eval(As Column() ...) ) i가 평가 되면 열(col)[] 또는 열(열)[행()] 로 변환되어 현재 행의 값에 접근할 수 있습니다. 평가되지 않고 다른 함수에서 사용되는 경우 열에 접근할 수 있습니다.
왜 이런 것 같을까?
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
row()=10;
Lag(:height); // 60
Show(lag(Column ("height"),1)); // Column("height") !!!
Show(lag(As Column ("height"),1)); // 60 !!!
Col Mean(:height); // 6255
Col Mean(:height, :age); // 60.285...
Show(Col Mean(Column ("height"))); // 62.55 (why does it work? another automatism because it is used so often?)
Try(Show(Col Mean(Column ("height"), :age)),Print(exception_msg)); // !!!
Show(Col Mean(As Column ("height"), :age)); // 60.285...
[ https://community.jmp.com/t5/Discussions/Using-numeric-objects-in-a-column-equation/mp/903939/highlight/true#M106270 에서 트리거됨 ]
Re: 강력한 열 참조이러한 학습을 바탕으로 저는 구체적인 질문을 가지고 있습니다.
포괄적인 개요가 있습니까?
- which functions act in the spirit of
Eval(:col), Where(:col=1) and Type(:col) ?
i.e. taking the column :col and 그것을 해석하다:col[행()] ?
더 보기...
rw = Row();
Where( :age == Column( "age" )[rw] );
- 그리고 어떤 함수는 " [행]을 무료로 추가" 하지 않고 열을 열로만 처리합니까 ?
열 중앙값(:col), 지연(:col,1) 과 같습니다.
어느 그룹에 회원이 가장 많나요?
Re: 강력한 열 참조콜 민은 대본에 잘 어울리지 않는 것 같아요.
그러나 데이터 테이블의 수식 열에 열 수식 Col Mean(:height,:age)를 적용한 경우 행 10의 값은 "60.285714286"입니다.
그리고 "62.55"는 Col Mean(;height)가 있는 수식 열에 있는 경우 행 10의 값입니다.
이 방법은 다른 테이블에서 값을 찾는 것을 숨기는 데 매우 유용하며, 특히 해당 테이블이 비공개인 경우에 유용합니다.
Re: 강력한 열 참조죄송하지만, 제가 무슨 말을 하는지 잘 모르겠어요.
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" , Private);
col median(dt:height);
vals= dt:height << get values();
vals=dt[0,"height"];
Median(vals);