출력은 다음과 같습니다.
포함(collist, col) = 0;
포함(collist, As Name(colname)) = 1;
Re: 열을 참조하는 이러한 방법이 다른 결과를 제공하는 이유는 무엇입니까?이 식은 열 참조를 저장하지 않습니다.
col = AsName("abc");
따라서 Contains() 함수는 0(거짓)을 반환합니다.열 참조를 저장하려면 Column( "name" )을 사용해야 합니다.
Re: 열을 참조하는 이러한 방법으로 인해 결과가 다른 이유는 무엇입니까?가상의 토끼굴이 눈앞에 있습니다. Mark의 답변이 필요한 전부일 수 있습니다.
흥미로운 질문입니다. 분명 똑같은 대답을 들을 수 있을 것 같지만...
C 및 기타 여러 언어와 달리 함수에 대한 인수는 함수가 호출되기 전에 평가되지 않습니다. 대신 함수는 매개변수를 처리하는 방법을 결정합니다. 그리고 JSL에는 AsName이 반환하는 값과 밀접하게 관련된 표현식이라는 변수 유형이 있습니다. 표현식 인수를 사용하여 함수를 호출하면 함수는 매개변수로 수행할 작업을 선택할 수 있습니다. 표현식을 평가할 수도 있습니다. a+2는 변수 a를 찾아 2를 더해야 합니다. 또는 표현식을 조작할 수도 있습니다. head(a+2)는 add 를 반환합니다. 귀하의 예에서 표현식은 abc 이며 이를 찾는 것은 데이터 테이블의 행에서 해당 값을 가져오는 것을 의미합니다.
(어려워요. 댓글을 정확하고 명확하게 만들기 위해 한 시간을 보냈습니다. 제 생각엔 맞는 것 같아요.)
dt = New Table( "test", New Column( "abc" ), New Column( "def" ) );
collist = {:abc, :def, .}; // <<< added a missing value in position 3
col = As Name( "abc" );// the Right Hand Side evaluates to the expression abc,
// and the expression is assigned to col. The 2nd argument to contains() is
// a name expression, and contains() evaluates that argument. It
// evaluates to missing because there is no subscript to pick a row.
Show( Name Expr( col ), Type( col ), Contains( collist, col ) ); // looks for a missing value
// Name Expr(col) = abc;
// Type(col) = "Number";
// Contains(collist, col) = 3;
colname = "abc";
// contains() evaluates the 2nd argument to a name, but does not
// do another evaluation of the name, so it locates the name
// in the list of names
Show( Type( As Name( colname ) ), Contains( collist, As Name( colname ) ) );
// Type(As Name(colname)) = "Name";
// Contains(collist, As Name(colname)) = 1;
마지막으로,
Show( Name Expr( col ), Type( col ), Contains( collist, Name Expr(col) ) );
당신이 원하는 것을 수행합니다; Contains()에 대한 두 번째 인수에는 값이 아닌 abc 표현식의 이름으로 Contains()를 평가하게 하는 nameexpr() 래퍼가 있습니다.
편집: 이것은 결코 쉬운 일이 아닙니다! @hogi는 Does Head가 인수를 평가합니까? 에서 head(a+2) 예제(위)가 잘못되었음을 지적합니다. ; 내 생각에 head()는 인수가 표현식을 포함하는 변수인지 확인하고, 그렇지 않은 경우 평가하여 표현식을 생성하는지 확인합니다.
열을 참조하는 이러한 방법이 다른 결과를 제공하는 이유는 무엇입니까?JSL이 열 참조를 처리하는 방법을 이해하는 데 어려움을 겪고 있으며 이러한 이유로 스크립트에서 계속 버그가 발생합니다.
다음 표현식이 다른 결과를 제공하는 이유는 무엇입니까?
열 참조를 함수에 동적으로 전달하는 가장 좋은 방법은 무엇입니까?
dt = New Table("test",
New Column("abc"),
New Column("def")
);
collist = {:abc, :def};
col = AsName("abc");
colname = "abc";
Show(Contains(collist, col));
Show(Contains(collist, AsName(colname)));출력은 다음과 같습니다.
Contains(collist, col) = 0;
Contains(collist, As Name(colname)) = 1;
자동화 및 스크립팅Re: 열을 참조하는 이러한 방법으로 인해 결과가 다른 이유는 무엇입니까?@Craige_Hales .
이 게시물을 보내주셔서 감사합니다. 보물 목록에 추가하겠습니다 
그 이유에 대한 힌트를 제공합니다. 이름 Expr(열(열 이름))
[예: @jthi ~에 Re: 표현식, 열 참조, 수식 및 열 이름 바꾸기에 대한 도움이 필요합니다. ] 정말 유용해요!
나는 이렇게 말하고 싶었습니다. 이제 정말 이해가 된 것 같습니다. 하지만 아래 결과 중 일부는 여전히 나에게 놀랍습니다.
나는 여전히 포괄적인 문서를 찾고 있습니다. 예를 들어 알아내는 방법 어떻게 함수는 매개변수를 처리합니다.
를 통해 검색할 때 포함 , Jmp는 그걸 왜 알고 있는 걸까요? 열("abc") = :abc?
dt = New Table( "test", New Column( "abc" ), New Column( "def" ) );
collist = {:abc, :def, .}; // <<< added a missing value in position 3
row()=0; //to be sure that the row index is really 0 :)
colname = "abc";
col = As Name( colname); // abc
col2 = :name("abc"); // .
col3 = As Column(colname); // .
col4 = Name Expr(As Column(colname)); // :abc
col5 = Column(colname); // Column("abc")
col6 = Name Expr(Column(colname)); // Column( colname )
col; // .
col2; // .
col3; // .
col4; // .
col5; // Column( "abc" )
col6; // Column( "abc" )
Show( Name Expr( col ), Type( col ), Contains( collist, col ) ); // :abc, Number, 3
Show( Name Expr( col2 ), Type( col2 ), Contains( collist, col2 ) ); // . , Number, 3
Show( Name Expr( col3 ), Type( col3 ), Contains( collist, col3 ) ); // ., Number, 3
Show( Name Expr( col4 ), Type( col4 ), Contains( collist, col4 ) ); // :abc, Number, 3
Show( Name Expr( col5 ), Type( col5 ), Contains( collist, col5 ) ); // Column("abc"), Column, 1 (!)
Show( Name Expr( col6 ), Type( col6 ), Contains( collist, col6 ) ); // Column(colname), Column, 1 (!!)
Show( Contains( collist, Name Expr(col) ) ); // 1
Show( Contains( collist, Name Expr(col2) ) ); // 3
Show( Contains( collist, Name Expr(col3) ) ); // 3
Show( Contains( collist, Name Expr(col4) ) ); // 1
Show( Contains( collist, Name Expr(col5) ) ); // 1
Show( Contains( collist, Name Expr(col6) ) ); // 0