JSL: 분석이 임시 데이터에 의존하는 경우 분석이 닫힐 때 데이터를 닫습니다...안녕하세요 여러분,
배경: 현재 Graph Builder에 공급되는 일부 데이터 포인트를 보관하기 위해 임시 데이터 테이블을 생성해야 하는 추가 기능을 작성 중입니다. 사용자가 그래프 빌더를 닫을 때 임시 데이터가 사라지기를 원합니다. 아주 쉽습니다. Graph Builder 호출을 변수에 저장하면 << On Close()를 추가하여 임시 데이터도 닫을 수 있습니다.
그러나 사용자가 두 개의 서로 다른 입력에 대해 추가 기능을 두 번 실행하여 두 개의 임시 데이터 테이블과 두 개의 그래프 빌더를 생성하려는 경우 이상한 일이 발생합니다. 이제 이 경우 그래프 빌더 중 하나를 닫으면 잘못된 임시 테이블이 닫힐 수 있습니다(다른 그래프 빌더도 함께 종료됨).
이에 대한 간단한 해결책이 있어야 한다고 생각합니다. 솔루션은 네임스페이스에 있어야 한다고 생각하지만 모든 것을 함께 연결하는 방법을 알 수 없습니다! 새 네임스페이스를 만들 때마다 "ns"가 덮어쓰이는 것 같습니다. 제가 가진 난제는 고유한 "ns" 값을 사용하여 추가 기능의 각 개별 인스턴스를 유지하는 방법을 파악하는 것입니다. 이러한 방식으로 여러 "On Close" 인스턴스 각각에 올바른 "ns" 값을 공급할 수 있습니다. " 코드가 생성됩니다.
다음은 제가 하려는 작업의 단순화된 버전입니다. 이 아이디어를 실행한 다음 "다른 항목 만들기" 버튼을 한 번 이상 클릭한 다음 그래프 빌더 중 하나를 닫으면 다른 그래프 빌더는 그대로 유지됩니다. 어떤 그래프인지에 대한 걱정은 없습니다. 빌더 먼저 해제하기로 선택했습니다.
Names Default to Here(1);
MyFunction = Function({},
ns = New Namespace();
ns:dt = New Table("Test Table",
<< New Column("Random X", << Formula(Random Normal())),
<< New Column("Random Y", << Formula(Random Normal())),
<< Add Rows(10),
invisible
);
ns:gb = New Window("Test Output",
Button Box("Make Another One",MyFunction()),
Graph Builder(
Show Control Panel( 0 ),
Show Legend( 0 ),
Variables( X( :Random X ), Y( :Random Y ) ),
Elements( Points( X, Y, Legend( 4 ) ) )
);
);
ns:gb << On Close(Try(Close(ns:dt, No Save)); ns << Delete);
);
MyFunction();
지혜 찾기: 다음에는 무엇을 시도해야 할까요?
품질 및 프로세스 엔지니어링Re: JSL: 분석이 임시 데이터에 의존하는 경우 분석이 닫힐 때 데이터를 닫습니다...이것은 훌륭한 "기능"입니다. 내 코드를 구현하는 것이 훨씬 빠르며, 모든 DisplayBox 변수를 대체하는 방법을 알아내는 대신 작업할 네임스페이스 등이 있는지 확인하여 조정하는 데 한두 시간 밖에 걸리지 않았습니다. 기대하지 않음).
이 솔루션에서는 새 실행을 트리거하는 버튼 상자가 클릭될 때마다 새 임시 파일을 작성하기 때문에 Open() 뒤에 Wait()를 추가한 다음 파일 삭제()를 추가했습니다.
Re: JSL: 분석이 임시 데이터에 의존하는 경우 분석이 닫힐 때 데이터를 닫습니다...나는 때때로 코드를 호출할 때마다 "Names Default to Here()"에 별도의 네임스페이스가 없다는 사실에 좌절감을 느낍니다.하지만 저는 코드를 디버깅할 때도 그 사실을 활용합니다.그래서 저는 두 가지 장점을 모두 봅니다.그러나 여기에 별도의 "Here" 이름 공간을 생성하는 기발한 아이디어가 있습니다.
원본 JSL에 //!를 추가하면 첫 번째 줄에서 해당 코드는 하드 드라이브에서 열릴 때 자동으로 실행됩니다.해당 스크립트가 열리면 고유한 "여기" 이름 공간이 있습니다.파일을 두 번째로 열면 고유한 "Here" 네임스페이스를 갖게 됩니다.
과거에 몇 번이나 이것을 사용했습니다 ???? 특징 ????.내 주요 프로그램은 Save Text File()을 사용하여 문제의 JSL을 $TEMP 위치에 저장한 다음 후속 코드가 저장된 JSL의 코드를 실행해야 할 때마다 Open()을 사용하여 파일을 실행합니다.저장된 JSL과의 값 전달은 기본 프로그램과 저장된 JSL 프로그램 모두에 정의된 네임스페이스를 통해 수행됩니다.
다음은 이러한 방식으로 설정된 원본 예제 코드이며, 실행 시 각 인스턴스는 독립적으로 실행됩니다.
names default to here(1);
graphJSL = "//!
Names Default to Here(1);
MyFunction = Function({},
ns = New Namespace();
ns:dt = New Table(\!"Test Table\!",
<< New Column(\!"Random X\!", << Formula(Random Normal())),
<< New Column(\!"Random Y\!", << Formula(Random Normal())),
<< Add Rows(10),
invisible
);
ns:gb = New Window(\!"Test Output\!",
Button Box(\!"Make Another One\!",MyFunction()),
Graph Builder(
Show Control Panel( 0 ),
Show Legend( 0 ),
Variables( X( :Random X ), Y( :Random Y ) ),
Elements( Points( X, Y, Legend( 4 ) ) )
);
);
ns:gb << On Close(Try(Close(ns:dt, No Save)); ns << Delete);
);
MyFunction();";
Save Text File( "$TEMP/Graph1.jsl", graphJSL );
open("$TEMP/Graph1.jsl");
open("$TEMP/Graph1.jsl");
Re: JSL: 분석이 임시 데이터에 의존하는 경우 분석이 닫힐 때 데이터를 닫습니다...감사해요. 이는 이와 같은 간단한 솔루션에 유용합니다.
엄청난 양의 코드를 다시 작성해야 할 수도 있지만 그때에도 내가 원하는 일을 할 수 있을지 확신할 수 없습니다. 내 실제 추가 기능은 여러 DisplayBox 참조를 ns에 저장하고 DisplayBox는 플랫폼과 데이터 테이블 모두에서 다양한 추가 작업을 트리거합니다. 추가 기능이 다시 시작되면 모든 DisplayBox 참조가 잠식됩니다. 운이 좋다면 대부분의 DisplayBox를 트리거 함수로 변환하여 이 << Parent를 누르고 다른 상자로 다시 드릴다운하여 출력 등을 업데이트할 수 있다고 가정합니다. 내가 하고 있는 일을 진지하게 다시 생각해 봐야 할 것 같습니다.
나는 Names Default to Here가 코드가 다시 실행될 때마다 별도의 Here 네임스페이스를 생성하기를 바랐지만 그렇지 않은 것 같습니다...
다른 길을 시작하기 전에 다른 좋은 옵션이 있나요?
Re: JSL: 분석이 임시 데이터에 의존하는 경우 분석이 닫힐 때 데이터를 닫습니다...문제는 두 번째 및 후속 함수 실행에서 변수 "ns"가 대체된다는 것입니다.따라서 데이터 테이블에 대한 고유 참조를 사용해야 합니다.다음은 데이터 테이블 이름을 사용하여 닫는 코드 버전입니다.
Names Default To Here( 1 );
MyFunction = Function( {},
ns = New Namespace();
ns:dt = New Table( "Test Table",
<<NEW column=""></NEW>