2010-11-24 14 views
8

是否有可能看到截斷的Message的完整版本? IE瀏覽器,我在Messages窗口看到0.105309,0.394682,<<20>>,<<20>>,<<20>>,0.394631。我猜<<20>>代表省略部分,我怎麼得到整個事情?在Mathematica中看到截斷的郵件

對於包含50個變量的問題,調用的函數是FindMaximum。

更新: 西蒙的答案似乎對於一般的信息工作,我也發現了一種方法,特定於捕捉FindMaximum「不是實數」的消息。

爲了得到這會導致FindMaximum失敗,「不是實數」的消息,你可以做以下的點(重新定義Message是我能找到的,因爲點不會被傳遞到EvaluationMonitorStepMonitor的唯一方法)

Unprotect[Message]; 
Message[FindMaximum::"nrnum", args___] := (captured = {args}; 
    Print["Captured FindMaximum::nrnum at ", First[{args}]]); 
{badvals, badvars, badobj} = ReleaseHold[captured]; 
+0

我不認爲它保存了關閉的消息(至少不是那些使用`Off []`機制的消息)。看到我的評論如下。 – Simon 2010-11-25 04:17:58

+1

@Simon未公開的函數``Internal`HandlerBlock``允許捕獲已關閉的消息。請參閱下面的答案。 – 2011-08-17 05:37:01

回答

10

我不確定您是否可以恢復已經生成的長消息。由於$MessageListMessage[]只存儲消息名稱,而不是傳遞給它們的參數。

要停止Short[]被自動應用於郵件,您可以Unset[$MessagePrePrint]。它的默認值是Automatic - 無論如何。


而不是打印長消息的時候,它可能會更好使用像

General::longmsg="A long message (`1`) was produced. The full message has been saved in `2`"; 
$MessagePrePrint=With[{bc=ByteCount[#]},If[bc>65536, 
    With[{fn=FileNameJoin[{$HomeDirectory,StringJoin["MmaMsg",ToString/@DateList[]]}]}, 
    Put[#,fn];Message[General::longmsg,bc,Row[{fn}]];Short[Shallow[#],1]], 
    #]]&; 

這將打印出的消息爲正常,除非ByteCount過大(> 65536)在哪種情況下會打印出兩條消息:第一條消息通知您生成了大量消息,併爲您提供保存文件的位置。第二個是完整消息的截斷版本。

0

報價this link

「當你做象徵性的計算,這是很容易用非常複雜的表達式落得通常情況下,你甚至不會希望看到一個計算的完整結果」

您可以使用Short來控制顯示器。

Short[%, n]將顯示您以前的結果n行,所以這可能是你需要的。

更多信息here

+0

我不明白如何使用它來獲取進入消息窗口的東西 – 2010-11-24 08:58:14

+0

@Yaroslav:好的,你執行了什麼樣的命令來獲得你描述的結果? – darioo 2010-11-24 08:59:48

2

我不是在正確的電腦前,現在,所以我不能測試它的肯定......但我認爲你可以完全自定義的消息處理行爲的東西,如:

Block[{Message = f}, ...] 

例如,您可能使用

f[args___] := Print[{args}]; 

再次,不在Mathematica面前。請隨意維基編輯這個答案。

2

無證功能Internal`HandlerBlockuncovered由馬克西姆Rytin)這裏是適用的:

Off[FindMaximum::"nrnum"] 
Internal`HandlerBlock[{"Message", Print}, 
Message[FindMaximum::"nrnum", arg1, arg2, arg3]] 
(* => Hold[Message[FindMaximum::nrnum,arg1,arg2,arg3],False]*) 

另一個處理程序類型是 「MessageTextFilter」。爲每個生成的消息調用「消息」爲 ,並將形式爲Hold [..., ...]的一個參數傳遞給處理程序函數,第二個元素設置爲False以獲取 靜音消息。對於 實際打印的消息調用「MessageTextFilter」,並使用三個參數調用該函數。

馬克西姆Rytin


另一種可能性是修改$MessagePrePrint以這樣的方式,這將打印包含在系細胞與可擴展到關於評價全參數截斷參數消息。它可以與Interpretation做到:

truncatingRules = {lst : {x_, y__} /; 
    MatrixQ[lst, NumberQ] && Length[lst] > 3 :> 
    {x /. v : {a_, b__} /; Length[v] > 3 :> 
     {a, 
     Interpretation[Style[Skeleton[Length[{b}]], Gray], 
     Sequence @@ {b}]}, 
    Interpretation[Style[Skeleton[Length[{y}]], Gray], 
     Sequence @@ {y}]}, 
    lst : {x_, y__} /; VectorQ[lst, NumberQ] && Length[lst] > 3 :> 
    {x, Interpretation[Style[Skeleton[Length[{y}]], Gray], 
     Sequence @@ {y}]}}; 

InlineCellInsideMessage[expr_] := 
Style[DisplayForm[ 
    Cell[BoxData[MakeBoxes[expr, StandardForm]], "Input"]], 
    FontWeight -> Bold, FontFamily -> "Courier", Background -> Yellow, 
    FontColor -> Red, FontSize -> 12, StripOnInput -> True, 
    AutoNumberFormatting -> True, ShowStringCharacters -> True] 

$MessagePrePrint = 
Function[expr, 
    If[TrueQ[ByteCount[Unevaluated[expr]] < $OutputSizeLimit/20.], 
    InlineCellInsideMessage[expr], 
    InlineCellInsideMessage[expr /. truncatingRules] 
    ]] 

當然的$MessagePrePrint以上版本僅僅是一個草案,但它說明了主要的想法。