2010-11-24 10 views
8

切り詰められたMessageのフルバージョンを見ることはできますか? IEの場合、Messagesウィンドウの0.105309,0.394682,<<20>>,<<20>>,<<20>>,0.394631の行に何かが表示されます。私は<<20>>が省略された部分を表していると推測していますが、どうすれば全体を得ることができますか?Mathematicaで切り捨てられたメッセージを見る

50個の変数の問題について、呼び出される関数はFindMaximumです。

更新: Simonの答えは一般的なメッセージではうまくいくようですが、FindMaximumの「実数ではない」メッセージをキャプチャすることに特有のアプローチも見つかりました。

FindMaximumは、あなたが次の操作を行うことができます「ではない実数」メッセージで失敗するポイントを取得するには

(再定義 Messageはポイントが EvaluationMonitorまたは StepMonitorに渡されませんので、私は見つけることができる唯一の方法です) this linkを引用
Unprotect[Message]; 
Message[FindMaximum::"nrnum", args___] := (captured = {args}; 
    Print["Captured FindMaximum::nrnum at ", First[{args}]]); 
{badvals, badvars, badobj} = ReleaseHold[captured]; 
+0

私は、オフになっているメッセージ(少なくともオフ[] []メカニズムを使用していないメッセージ)は保存しないと思います。以下の私のコメントを参照してください。 – Simon

+1

@Simon説明されていない関数 '' Internal'HandlerBlock''は、オフになっているメッセージを捕まえることができます。下の私の答えを見てください。 –

答えて

10

すでに生成されている長いメッセージを回復できるかどうかはわかりません。 $MessageListMessage[]は、渡された引数ではなく、メッセージ名のみを格納します。

Short[]がメッセージに自動的に適用されないようにするには、Unset[$MessagePrePrint]を入力してください。デフォルト値はAutomaticです。それが必要なものは何でも構いません。 ByteCountが大きすぎる場合を除き


むしろ印刷長いメッセージのすべての時間よりも、それは通常のようにメッセージをプリントアウトします

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]], 
    #]]&; 

これをようなものを使用する方がよいかもしれません(> 65536)中その場合、2つのメッセージが出力されます。最初のメッセージは大きなメッセージが生成されたことを通知し、保存されたファイルを提供します。 2番目は完全なメッセージの切り捨てられたバージョンです。

+2

$ MessagePrePrintもお勧めします。行こうとしているようだ。 –

+0

これはプラットフォームに依存しない、素晴らしいツールです。 –

+0

ところで、MessagePrePrintは、印刷されていないメッセージに対しても呼び出されるようです。 FindMaximumから呼び出されたLinearAlgebraサブルーチンの中には、100x100の密行列を入力としてMessagePrePrintを呼び出すため、何百ものファイルがありました。このメッセージがオフになっているため、通常は表示されないと思われます。 –

0

「あなたはシンボリック計算を行うと、非常に複雑な表情で終わることは非常に簡単です。多くの場合、あなたも、計算の完全な結果を見たいと思っていないだろう。」

Shortを使用して表示を制御できます。

Short[%, n]には、前の結果のn行が表示されるため、必要なものが表示されます。

詳細情報here

+0

メッセージウィンドウに入ったものを得るためにそれを使う方法がわかりません。 –

+0

@Yaroslav:あなたが説明した結果を得るためにどのようなコマンドを実行しましたか? – darioo

+0

FindMaximum。メッセージのことであり、コマンドの出力ではないことに注意してください。 –

2

私は今右のコンピュータの前にいないので、私は確かにそれをテストすることはできません...しかし、私はあなたが完全にのようなもので動作を取り扱うメッセージをカスタマイズすることができると思う:

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

たとえばあなたが今いないのMathematicaの前に、再び

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

使用することがあります。この回答を編集してwikiに自由に感じてください。

+0

これは通常メッセージウィンドウに出力されないメッセージをキャプチャしているようです。 –

2

文書化されていない機能Internal`HandlerBlock(マキシムRytinによってuncovered)はここに適用されます。

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

別のハンドラタイプは "MessageTextFilter" です。 "Message"は生成されたメッセージごとに のために呼び出され、ホールド[...、 ...]という形式の1つの引数をハンドラ関数に渡し、 メッセージの場合は2番目の要素をFalseに設定します。 が実際に印刷され、3つの引数を持つ関数を呼び出すメッセージに対して "MessageTextFilter"が呼び出されます。

マキシムRytin


別の可能性は、それが評価に関する完全な引数に拡張することができます切り捨て引数でインラインの細胞を含むメッセージを出力しますように$MessagePrePrintを変更することです。もちろん

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の上記のバージョンはちょうど草稿であるが、それは主なアイデアを示しています。Interpretationで行うことができます。

関連する問題