在Mathematica中查看截断的消息

时间:2010-11-24 08:27:09

标签: wolfram-mathematica

是否可以看到被截断的完整版Message? IE,我在0.105309,0.394682,<<20>>,<<20>>,<<20>>,0.394631窗口看到了Messages的内容。我猜<<20>>代表省略的部分,我如何得到整个东西?

对50个变量的问题调用的函数是FindMaximum。

更新的 Simon的回答似乎适用于一般消息,我也发现了一种特定于捕获FindMaximum“非实数”消息的方法。

要获得导致FindMaximum失败且带有“非实数”消息的点,您可以执行以下操作(重新定义Message是我能找到的唯一方法,因为该点未传递给{{ 1}}或EvaluationMonitor

StepMonitor

4 个答案:

答案 0 :(得分: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太大(&gt; 65536),否则这将正常打印出该消息,在这种情况下,它会打印出两条消息:第一条消息通知您生成了一条大消息,并为您提供文件保存位置。第二个是完整消息的截断版本。

答案 1 :(得分:2)

我现在不在正确的计算机前面,因此我无法对其进行测试......但我认为您可以完全自定义消息处理行为,例如:

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

例如,您可以使用

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

再次,现在不在Mathematica面前。请随时到维基编辑这个答案。

答案 2 :(得分:2)

未记录的函数Internal`HandlerBlock(Maxim {名称} uncovered)适用于此处:

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”   实际上是打印并用三个参数调用函数。

     

Maxim 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只是草稿,但它说明了主要想法。

答案 3 :(得分:0)

引用this link

“当你进行符号计算时,很容易得到极其复杂的表达式。通常,你甚至不希望看到完整的计算结果。”

您可以使用Short控制您的显示器。

Short[%, n]会显示您之前结果的n行,这可能就是您所需要的。

更多信息here