一般化された入力
Mathematica を含むほとんどのコンピュータ言語の基礎的パラダイムは,入力が与えられ出力へと処理されるというものである.歴史的に,そのような入力はあるシンタックスに従った文字と数の列で構成されている.
| Out[1]= |  |
|
Mathematica はバージョン3以降,入力として,テキスト入力と自由に混在させられる二次元のタイプセット数学表記をサポートしている.
| Out[2]= |  |
|
バージョン6からは,多様な非テキストオブジェクトが簡単に入力として使えるようになり,テキストやタイプセット表記と混ぜることができる.
次の入力を評価し,スライダーを動かす.その後再び評価し,新しい結果を見てみる.
| Out[3]= |  |
|
このスライダーの値が入力として与えられると,値はその位置で決定される.この場合は1と10の間の整数である.これはテキスト,数,変数名が使える入力行のどこに使うこともできる.
そのようなコントロールの作成方法は次のセクションで説明することにし,まず,ほとんどの場合このような入力に代わるよりよい方法があるということに注目する.
この例題を Manipulateという形式にすることで,スライダーが動くときにリアルタイムでその影響を見ることができる.
| Out[4]= |  |
|
しかし,従来の
Shift+Enter
で評価された入力内でコントロールを使ったほうがよい場合もある.例えば,評価が非常に遅い場合,コントロール周囲の入力行の残りの部分を編集する柔軟性が欲しい場合,コードの目的が後で使われる定義を作ることで,コントロールは初期値を指定するための便利な方法として使われている場合などがある.
例えば,後続するコードで使用される指定された色を初期化するためには, ColorSetterを使って色パレットを設定するとよい. |
どの色見本をクリックしても,新しい色がインタラクティブに選べるダイアログが表示される.これらの値は,より伝統的なテキスト的に指定された値であるかのように後続のプログラミングで使用することができる.
| Out[8]= |  |
|
これらの色見本は,数値的な色値からなる式よりも分かりやすく,簡単に編集できる色表現を提供する.
インラインコントロールの作成方法
Mathematica で何かを作成するときに最も柔軟で強力な方法は,それを返す関数を評価することである.
これらの例では
Sliderが使ってあるが,どのコントロールにも同じ原理が当てはまる.
コントロールオブジェクトには利用可能なコントロールオブジェクトがすべてリストされている.
Slider[]を評価することでスライダーを作成することができる.
| Out[9]= |  |
|
結果のスライダーオブジェクトは,他の種類の入力であるかのように,後続の入力セルにコピー・ペーストすることができる(または,出力セルをクリックしてタイプし始めるだけでもよい.これで自動的に入力セルに変換される).
このように作成されたコントロールは評価に対して不活性である.
例えば 2+とタイプし, +の後に上のスライダーをペーストすると以下の入力行ができる.それを評価する.
| Out[10]= |  |
|
評価すると,スライダーはスライダーのままである.この場合これは希望の結果ではない(これが便利な場合もあろうが).必要なのは,スライダーを入力として評価すると,スライダーオブジェクトではなく設定された値になることである.
現在の設定に評価されるオブジェクト
DynamicSettingがスライダーの周りにラップされ評価されると,新しいスライダーはもとのスライダーと全く同じに見えるが,評価でその現在の設定になるという隠された特性を持つ.
| Out[11]= |  |
|
新しいスライダーを入力行にコピー・ペーストすると,評価という動作により,スライダーが現在の値(マウスで動いていなければデフォルトの0.5)に変換される.
| Out[12]= |  |
|
前のセクションの例は,このようにして
DynamicSettingを使って作成したものである.
コントロールを含む入力行を構築するために,コピー・ペーストは非常に効果的に使えるが,特にコントロール作成のコマンドに慣れると,最も便利なのは
Ctrl+Shift+Enter(Macでは
Command+Return)を使って,コントロール式をその場で変換することである.
| Ctrl+Shift+Enter | 選択範囲を「その場」で評価し,その選択範囲を出力で置き換える |
現在位置で評価
| Out[13]= |  |
|
Ctrl+Shift+Enter(Macでは Command+Return)とタイプすると,コントロール式がその場で実際のコントロールに変換される( Ctrl+Shift+Enterは入力の評価に使われる通常の Shift+Enterではない). |
Shift+Enterで入力セルを評価すると,期待した結果が得られる.
| Out[15]= |  |
|
Sliderの引数はすべて,初期値,範囲,刻み幅を変更するために使うことができる.
| Out[16]= |  |
|
次に現在位置で評価し( Ctrl+Shift+Enter)テキストコマンドをスライダーに変換する.
| Out[17]= |  |
|
もちろんこれは他のコントロールでも使用することができる.
| Out[18]= |  |
|
| Out[19]= |  |
|
コントロール式には,通常のように変数への動的参照は含まれていない(
「Dynamicチュートリアル」を参照).ここで記述してあるように,入力式で使われるコントロールは,テキストコマンドのように静的で不活性なオブジェクトである.このようなコントロールは互いにリンクしないので,それが動く場合以外は,どれかを動かしても何も起らない.基本的に,入力行が評価されたときに使用するために,現在の状態を記録しているだけである.
入力式の複雑なテンプレート
入力式で複数のコントロールを含むすべてのパネルを使うことができる.さまざまなコントロールの値を,テンプレートが評価されたときに返される値にどのように組み立てるかを指定しなければならないため,そのようなパネルを構築することは,単独のコントロールの周囲に
DynamicSettingをラップするだけよりも複雑である.
関数
Interpretationを使うと,内蔵型の入力テンプレートオブジェクトを組み立てることができる.このオブジェクトには動的変数を介して互いにインタラクトする多くの内的部分が含まれる.引数は
Interpretation[variables, body, returnvalue]である.
第2引数はタイプセットされ,解釈オブジェクトの表示形になる.通常これには,フォーマットコンストラクトおよび第1引数で定義された変数への動的参照を持つコントロールが含まれる.
第3引数は,入力として与えられたときに,解釈オブジェクトの値として使われる式である.通常これは,第1引数にリストされた変数を含む式である.
1つの式として表示され,別の式として評価されるオブジェクト
下の入力セルを評価すると, Plotコマンドのテンプレートを含む出力セルが生成される.
| Out[20]= |  |
|
このテンプレートは,入力セルにコピーし,好きなように値を編集することができる.入力セルを Shift+Enter で評価すると,プロットが生成される.
| Out[21]= |  |
|
次のより高度な例では,テンプレートのコントロール間の通信に変数 definite が使われる.不定積分が選ばれると, min と max の値のフィールドは暗くなる.
| Out[1]= |  |
|
前のテンプレートをコピーすると,評価の際に積分を与える.
| Out[23]= |  |
|
既出のセクションの1つのコントロールでそうであるように,これらの入力テンプレートは新しい入力セルにコピー・ペーストすることができ,自由にテキスト入力を混ぜることができる.
積分の結果をテストするために,テンプレートを Dでラップして導関数を取り,結果が初期値と同じであることを検証する.
| Out[24]= |  |
|
上の例は非常に一般的なものである.多くのプログラムで見られるダイアログボックスのようなものである.しかしそれとは大きな違いがある.例えば,入力フィールドの
x2 に注目する.
Mathematica の入力フィールドは,他のプログラムのものと同様に見えるかもしれないが,内容はタイプセット数式でも,さらにはグラフィックスや他のコントロールでもよいのである(互いの内部にネストするテンプレートの書き方は次のセクションを参照のこと).
Mathematica のテンプレート(およびダイアログボックス)は,テキストフィールドの通常の格子を使うことに制限されない.
単純な定積分テンプレートを印刷のようにレイアウトしたものである.
| Out[25]= |  |
|
もちろん積分の評価にテンプレートは必要なく,キーボードショートカット( 「2次元表示記号の入力」に記載)か BasicMathInputパレットを使ってタイプセット数式として入力することができる.
| Out[26]= |  |
|
このようなテンプレートを作った方が便利かどうかはさまざまな要因によるが,大切なのは,
Mathematica ではテキスト,タイプセット数式,グラフィックスを含むフル装備のフォーマットコンストラクトが入力フィールドおよびテンプレートの内部でも周りでも使えるということである.
高度なトピック:テンプレートで早期評価を扱う
前セクションのテンプレートのように,定義されたテンプレートは初期化子に与えられた変数がすでに割り当てられた値を持っている場合(例えば,前セクションでは変数
x が値を持っている),あるいは,テンプレート構造が入力フィールドにペーストされた場合には,思ったように動作しない.評価の問題を正確に扱うためには,式ではなく解析されていないボックス構造の形式で値を保存する
InputFieldオブジェクトを使う必要がある(ボックス構造はそれが正しい
Mathematica の入力式であろうとなかろうと,表示可能な構造なら何でも表現するという点で文字列のようである).
| Out[27]= |  |
|
前のテンプレートのコピーは,評価すると積分を与える.
| Out[28]= |  |
|
このテンプレートは,不正使用だと思われる場合でも適切に動作する.例えば,繰り返しネストして,関数を数回積分することができる.
| Out[29]= |  |
|
InputFieldが自動的に大きくなり,大きい内容が入るようになっていることに注目していただきたい(この動作は
FieldSizeオプションで制御される.
| Out[30]= |  |
|
この種のものはすぐに収拾がつかなくなるが,ネストすることもできる.多分通常のものよりも面白い.
| Out[31]= |  |
|
入力としてのグラフィックス
Graphics,
Graphics3D,プロットコマンド,外部の画像ファイルからインポートしたプロットを含むグラフィカルオブジェクトはすべて入力として使うことができ,テキスト入力と自由に組み合わせることができる.グラフィックス,コントロール,タイプセット数式,テキストを組み合せるのに,制約はない.
| Out[32]= |  |
|
プロットのすぐ左に挿入点を置くためにクリックし, "Table["とタイプする. |
プロットの右をクリックしてタイプし,コマンドを終了する.評価する.
| Out[2]= |  |
|
コンテキストにより,プロットがいくつかの異なる大きさで表示されることに注目されたい.標準の自動プロットサイズには3つあり,プロットだけが出力にあれば最大,プロットがリストまたは表出力の中にあれば中,テキスト入力行で使用されていれば最小となる.これは主にグラフィックス入力をあまり大きくしないようにするためのものであるので,グラフィックスをクリックしたりリサイズハンドルを使ったりしてグラフィックスをリサイズすることや,明示的な
ImageSizeオプションを入れることも自由にできる.
| Out[3]= |  |
|
それから次を入力セルにコピー・ペーストし,簡単な画像処理を施す.
| Out[35]= |  |
|
入力としてグラフィックスが使えることで,この簡単な Manipulateの例にあるように,非常に豊かな入力が可能となる.
| Out[36]= |  |
|