5

Mathematicaのグラフィカル オブジェクトの内部表現を ではなく、ダブルクリックしてコードの一部を選択し、このコードを新しい入力に簡単にコピーできる、FullFormより読みやすい形で見たいと思うことがよくあります。しかし、 はデフォルトでMathematicaのコードではなく として表示されるため、デフォルトではこれが許可されません。Mathematicaのコードとして表示させる方法はありますか?InputFormCellInputFormInputFormStringInputForm

InputFormまた、座標のすべての長いリストが最初の座標として表示され、その後に でラップされたスキップされた座標値の数が続きSkeleton、すべての空Listsが削除され、すべての数字も短縮されて 6 桁以下に表示されるような短縮版を見たいと思うことがよくあります。座標のみに 6 桁を使用し、Hue有効数字 2 桁のみを表示するなどの色指令には使用することをお勧めします。例えば、

Plot[{Sin[x], .5 Sin[2 x]}, {x, 0, 2 \[Pi]}, 
  Filling -> {1 -> {2}}] // ShortInputForm

与えるべき:

Graphics[GraphicsComplex[{{1.28228`*^-7, 1.28228*^-7}, <<1133>>}, 
    {{{EdgeForm[], Directive[{Opacity[0.2], Hue[0.67, 0.6, 0.6]}], 
          GraphicsGroup[{Polygon[{{1133, <<578>>}}]}]}, 
        {EdgeForm[], Directive[{Opacity[0.2], Hue[0.67, 0.6, 0.6]}],              
     GraphicsGroup[{Polygon[{{432, <<556>>}}]}]}}, {{Hue[0.67, 0.6, 
      0.6], Line[{1, <<431>>}]}, {Hue[0.91, 0.6, 0.6], 
          Line[{432, <<701>>}]}}}], {AspectRatio -> GoldenRatio^(-1), 
  Axes -> True, AxesOrigin -> {0, 0}, 
    Method -> {"AxesInFront" -> True}, 
  PlotRange -> {{0, 2*Pi}, {-1., 1}}, 
    PlotRangeClipping -> True, 
  PlotRangePadding -> {Scaled[0.02], Scaled[0.02]}}]

-0.9999998592131705(は に変換され、は に変換され、 は に変換さ-1.れることに注意してください)。1.2822827157509358*^-71.28228*^-7Hue[0.9060679774997897, 0.6, 0.6]Hue[0.91, 0.6, 0.6]

このようにして、InputFormas Mathematicaのコードの出力を取得しShortInputForm、このコードの短縮バージョンを提供する関数も作成したいと考えています。誰でも私を助けることができますか?


質問の最初の部分に関しては、私が望むものを達成する1つの方法を見つけました:

Plot[{Sin[x], .5 Sin[2 x]}, {x, 0, 2 \[Pi]}, Filling -> {1 -> {2}}] //
   InputForm // StandardForm
4

2 に答える 2

8

アップデート

shortInputForm関数の最新バージョンはここにあります。


元の投稿

これが別のさらに良い解決策です( Mathematica 5と互換性があります):

myInputForm[expr_] := 
 Block[{oldContexts, output, interpretation, skeleton},
  output = ToString[expr, InputForm];
  oldContexts = {$Context, $ContextPath};
  $Context = "myTemp`"; $ContextPath = {$Context};
  output = DisplayForm@ToBoxes[ToExpression[output] /.
      {myTemp`interpretation -> If[$VersionNumber >= 6,
         System`Interpretation, System`First@{#} &],
       myTemp`Row -> System`Row,
       myTemp`skeleton -> System`Skeleton,
       myTemp`sequence :> (System`Sequence @@ # &)}, StandardForm];
  {$Context, $ContextPath} = oldContexts; output]
shortInputForm[expr_] := myInputForm[expr /. {{} -> Sequence[],
    lst : {x_ /; VectorQ[x, NumberQ], y__} /;
      (MatrixQ[lst, NumberQ] && Length[lst] > 3) :>
     {x /. v : {a_, b__} /; Length[v] > 3 :>
        {a, interpretation[skeleton[Length[{b}]], sequence@{b}]},
      interpretation[skeleton[Length[{y}]], sequence@{y}]},
    lst : {x_, y__} /; VectorQ[lst, NumberQ] && Length[lst] > 3 :>
     {x, interpretation[skeleton[Length[{y}]], sequence@{y}]}}]

使い方

このソリューションは単純なアイデアに基づいています。内部形式で(入力に適した式として)表示するにはGraphicsPointなどのタイプセット式への変換をブロックする必要があります。幸い、これを行うと、結果のStandardForm出力は元の式の形式(2次元)InputFormになっていることがわかります。これがまさに必要なことです!

しかし、これを行う方法は?まず第一に、この変換はFormatValues、などSymbolのように定義されて行われます。以下を評価することにより、そのようなの完全なリストを取得できます。GraphicsPointSymbol

list = Symbol /@ 
  Select[DeleteCases[Names["*"], "I" | "Infinity"], 
   ToExpression[#, InputForm, 
     Function[symbol, Length[FormatValues@symbol] > 0, HoldAll]] &]

私の最初のアイデアはBlock、これらすべてのものでしたSymbol(そしてそれは機能します!):

myInputForm[expr_] := 
 With[{list = list}, Block[list, RawBoxes@MakeBoxes@expr]]

ただし、この方法では、これらすべてのが評価され、のすべてのがSymbol評価されます。避けるべきだと思います。FormatValuesSymbol$ContextPath

これらをブロックする他の方法は、からFormatValuesコンテキストを削除することです。ただし、これらがコンテキストにまだ解決されていない場合にのみ機能します。したがって、最初に式をに変換し、次にコンテキストをから削除し、最後に文字列を元の式に逆変換する必要があります。次に、すべての新しいが現在のに関連付けられます(および、なども関連付けられます。これらはに含まれていないためです)。コンテキストシャドウの競合を防ぎ、必要に応じて簡単にクリアできるコンテキストに切り替えるために、コンテキストを散らかします。"System`"$ContextPathSymbol"System`"String"System`"$ContextPathSymbol$ContextGraphicsPoint$ContextPath"Global`"$Context"myTemp`"

これがどのように機能するかmyInputFormです。

今についてshortInputForm。の短縮バージョンを表示するだけでなくmyInputForm、短縮コードの一部を選択して新しい入力セルにコピーし、省略形のない完全なコードと同じようにこのコードを使用する機能を維持することも目的です。バージョン6以降では、を使用して後者を実現できInterpretationます。6より前のバージョンとの互換性のために、6未満のMathematica場合にこの機能を削除するコードを追加しました。$VersionNumber

作業中に直面した唯一の問題Interpretationは、属性がないため、の2番目の引数としてSequenceHold単純に指定できないことです。しかし、この問題は、シーケンスをラップしてからそれに実行することで簡単に回避できます。SequenceInterpretationListApplySequence

System`Sequence @@ # &

使用するすべての組み込みのコンテキストを正確に指定する必要があることに注意してください。Symbolこれらを呼び出した時点では、"System`"コンテキストはに含まれていないため$ContextPathです。

これで、これらの関数の開発で私が行った非標準的な決定が終了します。提案やコメントは大歓迎です!

ここに画像の説明を入力してください

于 2011-06-03T17:22:41.837 に答える
0

この時点で、私は次の解決策に到達しました。

round[x_, n_] := (10^-n*Round[10^n*MantissaExponent[x]]) /.
   {m_, e_} :> N[m*10^e];
ShortInputForm[expr_] := ((expr /.
       {{} -> Sequence[],
        lst : {x_ /; VectorQ[x, NumberQ], y__} /;
          (MatrixQ[lst, NumberQ] && Length[lst] > 2) :>
         {x, Skeleton[Length[{y}]]},
        lst : {x_, y__} /; VectorQ[lst, NumberQ] && Length[lst] > 2 :>
         {x, Skeleton[Length[{y}]]}} /.
      {exp : Except[List | Point][x__] /; 
         VectorQ[{x}, MachineNumberQ] :>
        (round[#, 2] & /@ exp), 
       x_Real /; MachineNumberQ[x] :> round[x, 6]})
    // InputForm // StandardForm)

今:

スクリーンショット

于 2011-06-03T11:15:11.930 に答える