評価モデル

Power Query の M 式言語の評価モデルは、スプレッドシートでよく見られる評価モデルに従ってモデル化されます。計算の順序は、セル内の式の間の依存関係に基づいて決定できます。

Excel のようなスプレッドシートで式を記述した場合、左側の数式が計算されると右側の値になります。

Evaluation Model 1

Evaluation Model 2

M の式では、前にある式を名前で参照でき、評価プロセスによって、参照されている式の計算順序が自動的に決定されます。

レコードを使用して、上のスプレッドシートの例に相当する式を作成してみましょう。 フィールドの値を初期化するときは、次のように、フィールド名によってレコード内の他のフィールドを参照します。

[
    A1 = A2 * 2,
    A2 = A3 + 1,
    A3 = 1
]

上の式は、次のレコードとして評価されます。

[
    A1 = 4,
    A2 = 2,
    A3 = 1
]

レコードを、他のレコードの中に含める、つまり入れ子にすることもできます。 参照演算子 ([ ]) を使用して、レコードのフィールドに名前でアクセスできます。 たとえば、次のレコードには、レコードが含まれる Sales という名前のフィールドと、Sales レコードの FirstHalf フィールドと SecondHalf フィールドにアクセスする Total という名前のフィールドがあります。

[
    Sales = [ FirstHalf = 1000, SecondHalf = 1100 ],
    Total = Sales[FirstHalf] + Sales[SecondHalf]
]

上の式は、次のレコードとして評価されます。

[
    Sales = [ FirstHalf = 1000, SecondHalf = 1100 ],
    Total = 2100
]

数値インデックスを使用してリスト内の項目にアクセスするには、位置指定インデックス演算子 ({ }) を使用します。 リスト内の値を参照するには、0 から始まるリストの先頭からのインデックスを使用します。 たとえば、次のリストの 1 番目と 2 番目の項目を参照するには、インデックス 0 と 1 を使用します。

[
    Sales =
        {
            [
                Year = 2007,
                FirstHalf = 1000,
                SecondHalf = 1100,
                Total = FirstHalf + SecondHalf // equals 2100
            ],
            [
                Year = 2008,
                FirstHalf = 1200,
                SecondHalf = 1300,
                Total = FirstHalf + SecondHalf // equals 2500
            ]
        },
    #"Total Sales" = Sales{0}[Total] + Sales{1}[Total] // equals 4600
]

遅延評価と即時評価

リストレコードテーブル メンバー式、および let 式 (「式、値、および let 式」を参照) は、遅延評価を使用して評価されます。 これらは、必要になったときに評価されます。 他の式はすべて、即時評価を使用して評価されます。 つまり、評価プロセス中に見つかった場合、これらは直ちに評価されます。 これについて考える良い方法は、リストまたはレコード式を評価すると、(参照またはインデックス演算子によって) 要求されたときに、リスト項目またはレコード フィールドの必要な計算方法を認識しているリストまたはレコードの値が返されることを、思い出すことです。