大家好,
我遇到了一些困難,在一個 Expr1() 中正常評估的變數在呼叫第一個 Expr 的另一個 Expr2() 中無法正確評估。 我有一些程式碼,其中定義了一個 Expr1() 來產生感興趣的列的分佈。 稍後我還有另一個表達式 Expr2() 會回呼 Expr1()。 Expr1() 中的某些變數在 Expr2() 中似乎無法正確計算。
對於視覺效果,Expr2() 產生一個如下所示的視窗:

第一個表達式 Expr1() 是在圖形產生器下產生包含的分發平台的表達式。 分佈下方的組合框和按鈕框允許用戶在不同的擬合統計數據之間切換,例如不同的 R^2、RMSE、平均 Abs Dev、-Logliklihood 等。我的目的是相應地更新 GB 和分佈。 GB 會適當更新,但發行版不會。 例如,將擬合統計量變更為 RMSE 時,結果如下:

它確實更新了分佈圖,但它使用它們的預設大小設置,而不是我在 Expr1() 中建立的大小設定。它應該看起來像這樣,其中分佈圖的大小與第一張圖片中的大小相同:

Expr1() 中產生分佈的程式碼部分如下:
//this part gets column names to insert into Dispatch() below<BR />sfitcol1 = Column( NNYCol + NNcolshift ) << Get Name;
sfitcol2 = Column( NNYCol + 1 + NNcolshift ) << Get Name;
sfitcol3 = Column( NNYCol + 2 + NNcolshift ) << Get Name;<BR /><BR />//in this example, the results are:<BR />//"RMSE Training"<BR />//"RMSE Validation"<BR />//"RMSE Test"
<BR />//this part generates the Distributions that will be used to change my output report in Expr2()
dt_results << Distribution(
Continuous Distribution( Column( Eval( NNYCol + NNcolshift ) ), Quantiles( 0 ) ),
Continuous Distribution( Column( Eval( NNYCol + 1 + NNcolshift ) ), Quantiles( 0 ) ),
Continuous Distribution( Column( Eval( NNYCol + 2 + NNcolshift ) ), Quantiles( 0 ) ),
SendToReport(
Dispatch( {sfitcol1}, "Distrib Histogram", FrameBox, {Frame Size( 60, 100 )} ),
Dispatch( {sfitcol1}, "Distrib Outlier Box", FrameBox, {Frame Size( 30, 100 )} ),
Dispatch( {sfitcol2}, "Distrib Histogram", FrameBox, {Frame Size( 60, 100 )} ),
Dispatch( {sfitcol2}, "Distrib Outlier Box", FrameBox, {Frame Size( 30, 100 )} ),
Dispatch( {sfitcol3}, "Distrib Histogram", FrameBox, {Frame Size( 60, 100 )} ),
Dispatch( {sfitcol3}, "Distrib Outlier Box", FrameBox, {Frame Size( 30, 100 )} )
)
);如果我自己運行 Expr1() ,它工作得很好,問題是當 Expr2() 呼叫 Expr1() 時它失敗,因為它沒有評估 Dispatch 中的變數 sfitcol# ,所以它沒有改變 FrameBox 大小正如程式碼中應該的那樣。
Expr2() 中交換分佈的程式碼部分(僅使用組合方塊)如下:
NNycb = Combo Box(
NNylist,
<<SET></SET>
將 Expr1() 的部分放入組合框函數中,然後嘗試執行 sfitcol 變量,然後傳送到報告以修改框架框,會在嵌入式日誌中出現以下錯誤:
在大綱上下文 {sfitcol1} 中找不到項目“sfitcol1”
在大綱上下文 {sfitcol1} 中找不到項目“sfitcol1”
在大綱上下文 {sfitcol2} 中找不到項目“sfitcol2”
在大綱上下文 {sfitcol2} 中找不到項目“sfitcol2”
在大綱上下文 {sfitcol3} 中找不到項目“sfitcol3”
在大綱上下文 {sfitcol3} 中找不到項目“sfitcol3”
如果我接著手動輸入列名稱,例如第一個 Dispatch: Send to Report(Dispatch({"RMSE Training"}, "Distrib Histogram", Framebox, Frame Size{(60,100)}),那麼它將更改對應的框架盒。

因此,這是可能的,並且應該完成我在 Expr1() 中定義事物的方式,但是在 Expr2() 中執行事物時傳遞變數而不是變數的值(文字)。 希望得到一些關於如何糾正這個問題的建議。 我認為我不需要使用 Eval(Substitute(Expr())) 類型的解決方案,但也許我需要。
非常感謝任何想法/想法/建議。
謝謝!,
DS
我會避免在創建發行版時設定框架大小,並在創建發行版後更改它們。 當您將特定框架框設為特定尺寸時,使用 XPath 取得引用然後更改尺寸應該相當容易。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dist = dt << Distribution(
Continuous Distribution(Column(:height), Quantiles(0)),
Continuous Distribution(Column(:weight), Quantiles(0))
);
wait(1); // demo purposes
rep = Report(dist);
(rep << XPath("//FrameBox[@helpKey='Distrib Histogram']")) << Frame Size(60, 100);
(rep << XPath("//FrameBox[@helpKey='Distrib Outlier Box']")) << Frame Size(30, 100);
wait(0);
dist << get xml;
關於您面臨的問題,我必須編寫測試腳本才能確定,但我的猜測是您應該在那裡評估這些值。
你好@jthi ,
再次感謝您對我的問題的快速回覆和解決。 XPath 命令真的很酷,只需閱讀它的簡短腳本索引條目就可以看出,我需要閱讀有關 XPath 的更多資訊以及如何充分利用它。 順便說一句,腳本俱樂部已經討論過這個問題了嗎? 如果沒有,那可能是個好話題。
不管怎樣,我修改了你的程式碼以更接近我手頭的情況,並且它運作得很好。 看下面的修改版本,其中Expr2呼叫Expr1,然後Expr2裡面,是配線架大小的改變。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Expr1 = Expr(
dist = dt << Distribution(
Continuous Distribution( Column( :height ), Quantiles( 0 ) ),
Continuous Distribution( Column( :weight ), Quantiles( 0 ) )
)
);
Expr2 = Expr(
Nwin = New Window( "Dists", Outline Box( "Results", Expr1 ) );
Wait( 1 ); // demo purposes
(Report( dist ) << XPath( "//FrameBox[@helpKey='Distrib Histogram']" )) << Frame Size( 60, 100 );
(Report( dist ) << XPath( "//FrameBox[@helpKey='Distrib Outlier Box']" )) << Frame Size( 30, 100 );
);
Expr2;
對於可能不知道這一點的人來說,需要注意的一件事是,您不能在 New Window() 物件中包含程式碼的 XPath 部分。
(Report( dist ) << XPath( "//FrameBox[@helpKey='Distrib Histogram']" )) << Frame Size( 60, 100 );
(Report( dist ) << XPath( "//FrameBox[@helpKey='Distrib Outlier Box']" )) << Frame Size( 30, 100 );
這部分程式碼必須位於新視窗之外。 在我的特定情況下,我發現當按下組合框或上一個/下一個按鈕時,我需要將其作為函數的一部分包含在內,否則會將分佈的大小調整為其原始大小。 例如,對於組合框選項,它看起來像:
NNycb = Combo Box(
NNylist,
<<SET></SET>
當第一次預置到視窗時,有一個短暫的時刻,分佈會調整為其預設大小,但隨後它們會很快正確地調整大小。
再次感謝您的幫助,我一直很高興在 JMP 討論論壇中學習新事物。
謝謝!,
DS
我想我在第 7 節(報告層)上很快就介紹了 XPath,但我認為訪問和遍歷報告層對於其他較長的會議來說是一個很好的主題。 Xpath 基本上是它自己的語言,也是從 JSL 直接轉換為其他程式語言的技能之一(正規表示式是另一個例子) XPath 教學 (w3schools.com) 。 當使用 << XPath 存取 JMP 中的報表層時,您可以輕鬆取得清單參考文獻,您可以向清單發送訊息,這使得它非常有用。 當您將 << Get XML 與 << XPath 組合時,您可以建立到不同顯示框的健全「路徑」(基本上是取得引用)。