Просмотр усеченных сообщений в Mathematica - PullRequest
8 голосов
/ 24 ноября 2010

Можно ли увидеть полную версию Message, которая была усечена? То есть я вижу что-то вроде 0.105309,0.394682,<<20>>,<<20>>,<<20>>,0.394631 в окне Messages. Я предполагаю <<20>> представляет пропущенные части, как я могу получить все это?

Вызванная функция FindMaximum для задачи с 50 переменными.

Обновление: Кажется, что ответ Саймона подходит для общих сообщений, также я нашел подход, который специфичен для захвата сообщения FindMaximum «не действительное число».

Чтобы получить точку, которая приводит к сбою FindMaximum с сообщением «не является действительным числом», вы можете сделать следующее (переопределение Message - это единственный подход, который я могу найти, поскольку точка не передается EvaluationMonitor или StepMonitor)

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

Ответы [ 4 ]

10 голосов
/ 24 ноября 2010

Я не уверен, что вы можете восстановить длинное сообщение, которое уже было сгенерировано.Поскольку $MessageList и Message[] хранят только имена сообщений, а не передаваемые им аргументы.

Чтобы запретить автоматическое применение 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), в этом случае оно напечатает два сообщения: первое информирует вас о том, что было создано большое сообщение, и дает файл, в котором оно было сохранено.Второй - это усеченная версия полного сообщения.

2 голосов
/ 17 августа 2011

Недокументированная функция Internal`HandlerBlock ( непокрытая Максима Рытина) применима здесь:

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

Другой тип обработчика - «MessageTextFilter».«Message» вызывается для каждого сгенерированного сообщения и передает один аргумент в виде Hold [..., ...] в функцию-обработчик, а для второго элемента установлено значение False для сообщений, для которых произошла ошибка.«MessageTextFilter» вызывается для сообщений, которые фактически распечатываются, и вызывает функцию с тремя аргументами.

Максим Рытин


Другая возможность заключается в изменении $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 является всего лишь черновиком, но она иллюстрирует основную идею.

2 голосов
/ 24 ноября 2010

Я сейчас не на правильном компьютере, поэтому не могу проверить его наверняка ... Но я думаю, что вы можете полностью настроить поведение обработки сообщений, например:

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

Например, вы можете использовать

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

Опять же, не перед Mathematica прямо сейчас.Пожалуйста, не стесняйтесь вики редактировать этот ответ.

0 голосов
/ 24 ноября 2010

Цитирование эта ссылка :

"Когда вы делаете символьные вычисления, очень легко получить очень сложные выражения. Часто вам даже не захочется видеть полный результатвычисления. "

Вы можете управлять своим дисплеем, используя Short.

Short[%, n] отобразит n строк вашего предыдущего результата, так что это может быть то, что вам нужно.

Дополнительная информация здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...