在Mathematica中查看截断的消息

Yar*_*tov 8 wolfram-mathematica

是否有可能看到Message被截断的完整版本?IE,我0.105309,0.394682,<<20>>,<<20>>,<<20>>,0.394631Messages窗口看到的东西.我猜是<<20>>代表省略的部分,我如何得到整个事情?

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

更新: Simon的答案似乎适用于一般消息,我也发现了一种特定于捕获FindMaximum"非实数"消息的方法.

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

Unprotect[Message];
Message[FindMaximum::"nrnum", args___] := (captured = {args}; 
   Print["Captured FindMaximum::nrnum at ", First[{args}]]);
{badvals, badvars, badobj} = ReleaseHold[captured];
Run Code Online (Sandbox Code Playgroud)

Sim*_*mon 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]],
  #]]&;
Run Code Online (Sandbox Code Playgroud)

这将打印出正常的消息,除非ByteCount它太大(> 65536),在这种情况下它将打印出两条消息:第一条通知您生成了一条大消息,并为您提供保存它的文件.第二个是完整消息的截断版本.

  • 我也打算建议$ MessagePrePrint.似乎要走了. (2认同)