如何防止 Run in Fit Model 產生報告?我正在編寫一個執行以下操作的腳本:
- 開啟“擬合模型”窗口,
- 允許使用者使用「擬合模型」視窗中的巨集和其他功能來填充它,
- 允許用戶單擊“運行”,此時將執行可能耗時的計算並產生報告。
單擊“運行”時執行的計算由儲存在“運行”按鈕中的腳本產生。該腳本會產生一份報告,這是用戶的內容應該看。但是,由於腳本已新增至「執行」按鈕,因此會出現所需的報告,但隨後會出現「執行」自行產生的「擬合最小二乘法」報告。擬合最小平方法報告對使用者來說毫無意義。
下面的腳本說明了這個問題。 在該腳本中,「執行」按鈕中的表達式「runExpr」僅建立一個複製資料表;這是為了簡化說明。在實際腳本中,此表達式 (runExpr) 根據「擬合模型」視窗中輸入的效果執行大量分析。 此外,在實際腳本中,使用者以互動方式填入「擬合模型」視窗;為了方便起見,我在下面的腳本中填入了「擬合模型」視窗。
Names Default To Here( 1 );
runExpr = Expr(
// Creates a clone data table for illustration;
dt << Subset( Output Table( "Clone Table" ), All rows );
);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
fmSLS = Fit Model(
Y( :weight ),
Effects( :age, :height, :age * :height ),
Personality( "Standard Least Squares" ),
Emphasis( "Minimal Report" ),
);
r = fmSLS << Report;
r[Button Box( 9 )] << Set Script( runExpr);
當您像使用者一樣按一下「執行」時,會出現複製表,但頂部的視窗是「執行」命令產生的「擬合最小平方法」報告。我想阻止該報告出現。
為此:
- 我嘗試在 runExpr 中使用 Throw() 和 Stop(),但沒有成功。
- 我考慮過使用模態窗口,但我需要“擬合模型”窗口中的巨集功能,並且我看不到如何使模態窗口幫助。
- 我能想到的解決“擬合最小二乘法”報告的唯一方法是向腳本添加一個定時循環,如下所示。 但這充滿了危險。無法知道 runExpr 需要多長時間才能完成,並且如果使用者決定不單擊“運行”,則腳本將繼續運行直到逾時。
任何想法或幫助將不勝感激!
Names Default To Here( 1 );
runExpr = Expr(
// Creates a clone data table for illustration;
dt << Subset( Output Table( "Clone Table" ), All rows );
fm_Flag = 1
);
fm_Flag = 0; // Sets flag for timing
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
fmSLS = Fit Model(
Y( :weight ),
Effects( :age, :height, :age * :height ),
Personality( "Standard Least Squares" ),
Emphasis( "Minimal Report" ),
);
r = fmSLS << Report;
r[Button Box( 9 )] << Set Script( runExpr; fm_Flag = 1 );
For( i = 1, i <= 100, i++,
If(fm_Flag < 1, Wait(0.5), windowsopen = Get Window List(); windowsopen[nItems(windowsopen)] << Close Window; Stop() )
);
大規模客製化回覆:如何防止 Run in Fit Model 產生報告?哦,天哪,太棒了!!!多麼完美的“開箱即用”解決方案!
我計劃今天晚些時候嘗試放置自訂按鈕,但我不知道我是否會嘗試放置它超過運行按鈕。這是一個很好的解決方案,我想我也可以在其他地方使用這個概念。我敢打賭很多用戶會發現它很有用!
太感謝了!!!
回覆:如何防止 Run in Fit Model 產生報告?啊哈!刪除或修改「執行」按鈕似乎很困難,但您可以將新按鈕放在它的正上方(至少在 Windows 上使用 JMP 15.2.1...):
Names Default to Here( 1 );
run expr = Expr(
// desired report
personality = Report( fm )[ComboBox(1)] << Get Selected;
Show( personality );
);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
fm = dt << Fit Model(
Y( :weight ),
Effects( :age, :sex, :height ),
Personality( "Standard Least Squares" ),
Emphasis( "Minimal Report" )
);
// New button the user should click on
(((fm << XPath("//ButtonBox[@title='Run']"))[1] << parent) ) << prepend(
bb = Button Box("Launch custom script", run expr; fm << Close Window;) );
//make sure it is right on top of the old one
bb << set property("Margin", {Left(0), Right(0), Bottom(0), Top(0)});
// Rename old button in case it isn't hidden, and show error if user clicks it
(fm << XPath("//ButtonBox[@title='Run']"))[1] << Set Script( New Window( "Use other button",
Text Box("Woops...\!n\!nPlease use the button at the bottom of the fit model dialog to launch this script.")));
(fm << XPath("//ButtonBox[@title='Run']"))[1] << Set Button Name( "Do Not Use");回覆:如何防止 Run in Fit Model 產生報告?馬克,你提出了一個很好的問題,並且提出了一個很好的觀點。也許有更好的方法來實現我的目標。請參閱我上面對“ih”的回應。我需要“擬合模型”視窗只是因為它允許用戶靈活地建構效果。 我正在編寫的腳本使用這些效果來使用分數引導權重建立模型。(無論如何,上面對“ih”的回復中有更多詳細信息。)
我知道有一些腳本函數可以幫助建立模型效果,但確實需要複製「擬合模型」視窗中存在的許多功能。我希望人們可以使用該視窗來建立效果,而無需擬合模型!
回覆:如何防止 Run in Fit Model 產生報告?非常感謝這個建議——這不是我考慮過的事情,但它可能是最好的建議。但是,如果使用者點擊「運行」(這必然會發生),那麼擬合模型就會運行,並且使用者必須再次運行腳本。這不是最佳的。但也許我可以利用這個想法。
您和馬克都提出了一個很好的問題,為什麼我堅持使用「擬合模型」視窗。這是因為我需要允許使用者存取巨集和交叉功能。使用者將添加他們認為重要的效果,在許多情況下,這些效果將包括完整的階乘模型以及一些額外的三向交互項。我考慮過創建一個模式對話框,允許使用者輸入模型的“類型”,但此功能會限制使用者。因此,我不斷回到需要有一個具有 Fit Model 大部分功能的視窗。此外,使用者熟悉使用「擬合模型」輸入效果,因此從這個角度來看,使用該對話方塊是有意義的。(我很欣賞您提供的鏈接,但是它沒有解決效果的構建問題。複製擬合模型中存在的「交叉」、「全階乘」、「階乘階乘」和「多項式階數」功能需要編寫大量腳本。其實我覺得我沒有這個能力!)
現在,我為什麼不想跑步適合模型嗎?因為我需要的只是反應和效果;我只需要“擬合模型”的功能來建立效果。自訂腳本使用這些與分數隨機加權引導程式一起使用模型平均來建立模型。建立這些模型和摘要報告的腳本目前是放置在「執行」按鈕中的表達式。因此,按一下「運行」將建立該自訂報告。一切都很好,除了當用戶單擊“運行”時,擬合模型生成的不相關的報告出現在自訂報告上。
再次感謝您的幫忙。我肯定會嘗試自訂按鈕的想法。
回覆:如何防止 Run in Fit Model 產生報告?如果您不需要「擬合最小二乘」平台,為什麼要使用「擬合模型」對話方塊? 可能還有另一種方法可以實現您想要的目標。
回覆:如何防止 Run in Fit Model 產生報告?您需要多少“模型規格”對話框? 我忍不住認為,用滿足您確切需求的新視窗替換該步驟會更好。這篇文章中的範例可能會有所幫助:
完全模態提示列
如果您想使用模型規範窗口,您可以為用戶提供一個新按鈕以供單擊:
Names Default to Here( 1 );
run expr = Expr(
// desired report
personality = Report( fm )[ComboBox(1)] << Get Selected;
Show( personality );
);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
fm = dt << Fit Model(
Y( :weight ),
Effects( :age, :sex, :height ),
Personality( "Standard Least Squares" ),
Emphasis( "Minimal Report" )
);
// Show error if user clicks the wrong button
(fm << XPath("//ButtonBox[@title='Run']"))[1] << Set Script( New Window( "Use other bottom",
Text Box("Woops...\!n\!nPlease use the button at the bottom of the fit model dialog to launch this script.")));
// Button the user should click on
(fm << XPath("//OutlineBox"))[1] << Append(Button Box("Launch custom script", run expr; fm << Close Window;));<BR />
回覆:如何防止 Run in Fit Model 產生報告?是的,按鈕框中的腳本似乎在執行“運行”按鈕的內建行為之前運行。
這個小問題真讓人煩惱! 必須有一種方法可以延遲腳本的執行,直到發生某個動作(例如按「執行」按鈕)。 或者,阻止執行內建行為(但正如我所說,將 Throw 和 Stop 放在 runExpr 中不起作用)。
感謝您的幫助,馬克。回覆:如何防止 Run in Fit Model 產生報告?你是對的。 我嘗試修改我的插圖,但在創建“擬合最小二乘法”報告之前會評估附加到按鈕框的腳本,因此它無效。
Names Default to Here( 1 );
run expr = Expr(
// desired report
personality = Report( fm )[ComboBox(1)] << Get Selected;
Show( personality );
// undesired report
window = Get Window List();
For( w = 1, w <= N Items( window ), w++,
If( Contains( window[w] << Get Window Title, "Fit Least Squares" ),
window[w] << Close Window;
Break();
);
);
);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
fm = dt << Fit Model(
Y( :weight ),
Effects( :age, :sex, :height ),
Personality( "Standard Least Squares" ),
Emphasis( "Minimal Report" )
);
Report( fm )[ButtonBox(9)] << Set Script( run expr );
// nothing after this point
回覆:如何防止 Run in Fit Model 產生報告?馬克,謝謝你,但我認為這不適合我的情況。使用者需要填充“擬合模型”視窗。如果我將視窗元件新增到我的腳本中,它會在使用者填充“擬合模型”視窗之前運行。因此,當使用者點擊「運行」時,腳本的該部分就會「消失」。請參閱我的帖子中的第二個腳本,以了解我按照您建議的方式提出的非常不優雅的解決方法。必須考慮使用者填入「擬合模型」所需的時間,以及在「執行」按鈕中執行腳本所需的時間。
回覆:如何防止 Run in Fit Model 產生報告?我不知道如何修改附加到“運行”按鈕框的腳本,但您可以隨後找到並關閉該視窗。 請參閱此圖:
fm = Current data Table() << Fit Model(
Y( :weight ),
Effects( :age, :sex, :height ),
Personality( "Standard Least Squares" ),
Emphasis( "Effect Leverage" )
);
fls = fm << Run;
window = Get Window List();
For( w = 1, w <= N Items( window ), w++,
If( Contains( window[w] << Get Window Title, "Fit Least Squares" ),
window[w] << Close Window;
Break();
);
);