Eval Insert, Eval Expr, Parse 및 Substitute를 사용하여 하나의 표현식을 다른 표현식에 삽입합니다.문제변수 값을 삽입해야 합니다. 표현으로 전체 코드를 평가하지 않고.예는 다음과 같습니다:
- 스크립트를 사용하여 열 수식 작성
- 다른 스크립트를 사용하여 스크립트 작성
다음은 테이블에서 선택한 열을 변환하는 스크립트입니다. 이것은 아니다 열 이름 대신 'cols[i]' 표현식이 열 수식에 저장되기 때문입니다.
//Open A Table and select a few columns
dt = Open( "$Sample_data/iris.jmp" );
cols = {Sepal length, Petal length};
//This code does not work
For( i = 1, i <= N Items(cols), i++,
dt << New Column(
"2 * " || Char( cols[i] ),
Numeric,
"Continuous",
Formula( As Column( cols[i] ) * 2)
)
);
올바른 이름으로 새 열이 생성되지만 다음 수식은 다음과 같습니다.

해결책
이 문제를 해결하기 위한 두 가지 일반적인 전략이 있습니다. 나머지 부분보다 먼저 일부를 평가하면서 표현식을 작성하는 것과 표현식을 문자열로 작성한 다음 평가하는 것입니다. 삽입되는 변수는 실제로 어떤 길이의 표현식이라도 될 수 있습니다.
표현식
이러한 방법에는 표현식을 작성하고 나머지 부분보다 먼저 표현식의 한 부분을 평가하는 작업이 포함됩니다. Eval, Eval Expr 및 Expr의 올바른 조합을 찾는 것은 까다로울 수 있지만 구문 강조 표시를 확인하고 스크립트 편집기를 사용하여 괄호가 일치하는지 확인할 수 있습니다.
평가, 평가 Expr
표현식을 작성하고 즉시 평가해야 하는 부분을 Expr()로 래핑합니다.
//Eval Expr
For( i = 1, i <= N Items(cols), i++,
Eval( Eval Expr(
dt << New Column(
"2 * " || Char( cols[i] ),
Numeric,
"Continuous",
Formula( As Column( Expr( Char( cols[i] ) ) ) * 2)
)
) )
);
대리자
표현식을 작성하고 그 일부를 평가된 코드로 바꿉니다.
//Substitute
For( i = 1, i <= N Items(cols), i++,
Eval( Substitute(
Expr( dt << New Column(
"2 * " || cn,
Numeric,
"Continuous",
Formula( As Column( cn ) * 2)
) ),
Expr( cn ),
Char( cols[i] )
) )
);
문자열 메소드
이러한 방법에는 표현식을 문자열로 작성하고 Parse()를 사용하여 이를 표현식으로 변환한 다음 Eval()을 사용하여 실제로 평가하는 작업이 포함됩니다. 이러한 방법의 단점은 구문 강조 표시가 보이지 않고, \!" 또는 \[ ... ]\를 사용하여 큰따옴표를 처리해야 하며, 특히 긴 표현식의 경우 일반적으로 나중에 문제를 해결하거나 수정하기 어렵다는 것입니다.
평가 삽입
평가되어 문자열 내부에 배치되는 '인라인' 코드를 사용하여 표현식을 문자열로 작성한 다음 이를 구문 분석하고 평가합니다.
//Eval Insert
For( i = 1, i <= N Items(cols), i++,
Eval( Parse( Eval Insert(
"\[dt << New Column(
"2 * ^Char( cols[i] )^",
Numeric,
"Continuous",
Formula( As Column( "^Char( cols[i] )^" ) * 2)
)]\"
) ) );
);
대리자
평가된 표현식으로 대체되는 자리 표시자를 사용하여 문자열에 표현식을 작성합니다. 이는 위와 동일한 기능입니다.
//Substitute
For( i = 1, i <= N Items(cols), i++,
Eval( Parse( Substitute(
"\[dt << New Column(
"2 * ColumnName",
Numeric,
"Continuous",
Formula( As Column( "ColumnName" ) * 2)
)]\",
"ColumnName",
Char( cols[i] )
) ) );
);
사슬 같이 잇다
가장 기본적인 형태는 '||'를 사용하여 표현식을 작성하는 것입니다.\!" 대신 \[ ... ]\를 사용할 수 있습니다.
//Concatenate
For( i = 1, i <= N Items(cols), i++,
Eval( Parse(
"dt << New Column(
\!"2 * " || Char( cols[i] ) || "\!",
Numeric,
\!"Continuous\!",
Formula( As Column( \!"" || Char( cols[i] ) || "\!" ) * 2)
)"
) );
);
또한보십시오
변수나 표현식을 다른 표현식에 삽입합니다.Eval(), Eval Expr(), Substitute(), Parse(), Eval Insert()에 대한 간략한 소개입니다.
Re: Eval Insert, Eval Expr, Parse 및 Substitute를 사용하여 하나의 표현식을 다른 표현식에 삽입하세요.다음은 표현식 메서드와 문자열 메서드의 예입니다.
Names default to here(1);
//Open A Table and select a few columns
dt = Open( "$Sample_data/iris.jmp" );
cols = {Sepal length, Petal length};
//Eval Expr
For( i = 1, i <= N Items(cols), i++,
Eval( Eval Expr(
dt << New Column(
"Eval Expr 2 * " || Char( cols[i] ),
Numeric,
"Continuous",
Formula( Expr( cols[i] ) * 2 )
)
) )
);
//Substitute with String
For( i = 1, i <= N Items(cols), i++,
Eval( Parse( Substitute(
"\[dt << New Column(
"Substitute String 2 * ColumnName",
Numeric,
"Continuous",
Formula( :"ColumnName"n * 2)
)]\",
"ColumnName",
Char( cols[i] )
) ) );
);
Re: Eval Insert, Eval Expr, Parse 및 Substitute를 사용하여 하나의 표현식을 다른 표현식에 삽입하세요.여기에는 불필요한 기능이 있을 수 있지만 열 참조(As Column(name))와 함께 Name Expr을 사용할 수 있습니다.
Names Default To Here(1);
//Open A Table and select a few columns
dt = Open("$Sample_data/iris.jmp");
cols = {Sepal length, Petal length};
For(i = 1, i <= N Items(cols), i++,
Eval(Eval Expr(dt << New Column("2 * " || Char(cols[i]), Numeric, "Continuous", Formula(Expr(Name Expr(As Column(Char(cols[i])))) * 2))))
);
Re: Eval Insert, Eval Expr, Parse 및 Substitute를 사용하여 하나의 표현식을 다른 표현식에 삽입하세요.As Column()이 필요하지 않은 방법이 있습니까?
여기서는 문자열을 전달할 때 이를 포함해야 하는데, 수식에 :column이 남도록 하려면 어떻게 해야 하는지 궁금합니다.
Re: Eval Insert, Eval Expr, Parse 및 Substitute를 사용하여 하나의 표현식을 다른 표현식에 삽입하세요.정말 감사합니다! 예. 루프 시작이 맞습니다. 나는 그것을 깨닫지 못했습니다.
Re: Eval Insert, Eval Expr, Parse 및 Substitute를 사용하여 하나의 표현식을 다른 표현식에 삽입하세요.@날짜 ,
for 루프는 i=2로 시작하므로 첫 번째 열을 건너뛰고 데이터 테이블이 생성될 때 Column 1이라는 단일 빈 열이 생성되었습니다. 다음과 같이 i=1로 루프를 시작하고 이후 열 1을 삭제하여 이 문제를 '수정'할 수 있습니다.
더보기... Re: Eval Insert, Eval Expr, Parse 및 Substitute를 사용하여 하나의 표현식을 다른 표현식에 삽입하세요.안녕하세요,
그것은 b와 c 열에서 작동했습니다. "a"가 나오지 않습니다. 대신 빈 열 1이 나타납니다.
그래서 New Table() 안에 "for 루프"를 넣으려고 했습니다. 하지만 이 접근 방식을 사용하면 수식 내부의 표현식만 얻을 수 있습니다.
필요한 모든 열을 한 번에 가져오기 위해 New Table() 내부의 수식을 사용하여 "for 루프"를 처리하는 방법을 알고 있습니까?
Re: Eval Insert, Eval Expr, Parse 및 Substitute를 사용하여 하나의 표현식을 다른 표현식에 삽입하세요.안녕 @날짜 ,
해당 표현식을 공식에 넣기 전에 JMP에게 해당 표현식을 평가하라고 지시해야 합니다. 열 공식에 포함되면 더 이상 다른 테이블을 참조하는 방법을 알 수 없기 때문입니다. 내가 선호하는 방법(위의 맨 위 방법)을 사용하면 다음과 같이 보일 수 있습니다.
Names Default To Here( 1 ); //
//Table with columns you want to create
mydt = New Table( "Source",
Add Rows( 3 ),
New Column( "Name", Character, "Nominal", Set Values( {"a", "b", "c"} ) ),
New Column( "Mean", Numeric, "Continuous", Format( "Best", 12 ),
Set Values( [1, 2, 3] ) ),
New Column( "Std Dev", Numeric, "Continuous", Format( "Best", 12 ),
Set Values( [0.5, 0.6, 0.7] ) )
);
my_newdt = New Table( "Target", Add Rows( 100 ) );
// For loop. Add Columns
For( i = 2, i <= N Rows( mydt ), i++, //
Eval( Eval Expr(
my_newdt << New Column( Column( mydt, 1 )[i],
Numeric,
"Continuous",
Format( "Best", 6 ),
Formula( Random Normal( Expr( As Column( mydt, :Mean )[i] ), Expr( As Column( mydt, :Std Dev )[i] ) ) )//
)
) )
);
Re: Eval Insert, Eval Expr, Parse 및 Substitute를 사용하여 하나의 표현식을 다른 표현식에 삽입하세요.열에 수식을 사용하여 테이블 만들기 - Random Normal() - 외부 jmp에서
나는 이미 내 문제에 대한 효과적인 해결책을 얻었습니다. 위의 링크.
그러나 나는 내 코드가 제대로 작동하도록 집착하고 있습니다.
그리고 이 스레드는 내 주제에 응답하는 것 같습니다.
위의 기술 중 일부를 시도했습니다. 하지만 작동하지 않거나 이해하지 못합니다.
나에게 제안할 것이 있나요? 표현을 얻는 방법 " 열로( mydt, :Mean )[1] " 소스 값으로 확인되었나요?
//not working
Clear Globals();
Names Default To Here( 1 ); //
mydt = Current Data Table();
// New data table
my_newdt = New Table( "Table Name",
// Add Rows( N Rows( mydt ) ), // row count can be set by hand e.g. 1000
Add Rows( 10 ), // row count can be set by hand e.g. 1000
New Column( Column( mydt, 1 )[1], // Loop i==1
Numeric,
"Continuous",
Format( "Best", 6 ),
Formula( Random Normal( As Column( mydt, :Mean )[1], 0.01))// As Column(mydt, :Mean )[1] is evalueted in the target table. But Formula has the expression "As Column( mydt, :Mean )[1]" instead of a value from source table
)
);// End New data table
/*// For loop. Add Columns
For( i = 2, i <= N Rows( mydt ), i++, //
my_newdt << New Column( Column( mydt, 1 )[i], // Loop i ==2
Numeric,
"Continuous",
Format( "Best", 6 ),
Set Each Value( Random Normal( As Column( mydt, :Mean )[i], As Column( mydt, :Std Dev )[i] ) )//
)
)// End for loop;
;*/
Re: Eval Insert, Eval Expr, Parse 및 Substitute를 사용하여 하나의 표현식을 다른 표현식에 삽입하세요.굉장히 유용하다!
Re: Eval Insert, Eval Expr, Parse 및 Substitute를 사용하여 하나의 표현식을 다른 표현식에 삽입하세요.JSL 표현식을 동적으로 구성하는 데 사용할 수 있는 방법에 대한 훌륭한 검토입니다.이것을 마스터하면 모든 것이 매우 간단해집니다.