目標: 空の値を持つ列の行数を数えます。
方法 1 (動作):
dt = CurrentDataTable();
Print(NRows(dt<<GETROWSWHERE></GETROWSWHERE>
方法 2 (動作):
Print(NRows(dt<<GETROWSWHERE></GETROWSWHERE></CODE></PRE><P> </P><P><U>方法 3 (機能しません):</U></P><PRE><CODE class=" language-jsl">Print(NRows(dt<<GETROWSWHERE></GETROWSWHERE>
方法 3 のデバッガーによって返されるエラーは次のとおりです。 "'Is Missing' のアクセスまたは評価では、引数は数値でなければなりません{1}、Is Missing/*####*/(Column( dt, "ColName" ))"
したがって、dt:ColName による列の参照は dt:Name("ColName") と同じであることを理解するのは非常に簡単ですが、Column(dt, "ColName") のパフォーマンスが異なる理由については混乱しています。
さらに、次のことを行うとします。
ref1 = dt:ColName;
ref2 = dt:Name("ColName");
ref3 = Column(dt, "ColName");次に、単一の数値 (列の最初の値に対応する) を保持する ref1 と ref2 を取得しますが、ref3 は適切な Column オブジェクトへの参照です (3 つの宣言すべてが完了すると予想していたように)。
ref1 と ref2 の結果は特に奇妙に思えます。上記の方法 1 と 2 は、列内の空のセルの正しい数を返していたので、参照の実装では、最初の値だけを見ているだけではありませんでした。列。dt:ColName が変数に設定されている場合、dt:ColName 全体を使用することは受け入れられず、代わりに変数を dt:ColName[1] に設定することを選択しているようです。
なぜこのような振る舞いをするのですか?私が使うときref = dt:ColName 、によって生成された同じ列参照を返すことを期待しますref = 列(dt, "ColName")または、おそらく、列の内容に対応する値が表示される順序でいっぱいのマトリックス/リストです。
基本的に、私の質問は (1) なぜこれらの動作が異なるのか、(2) dt:ColName を使用する必要がある場合と、Column(dt, "ColName") を使用する必要がある場合を特定する簡単な方法はありますか?そして(3)なぜref1 = dt:CFU列自体への参照または列のすべての値に対応する完全に入力されたマトリックス/リストの代わりに、列の最初の値への参照を返しますか?
ありがとう!
[] が必要な理由は、Get Rows Where が現在の行に依存しているためです。 Column("X")[] を使用すると、列 "X" の現在の行が参照され、Column("X")[Row()] と同等です。
として@pmroz現在の行の列への参照を返すため、AsColumn("X") は機能します。
Get Rows Where や Select Where などのメッセージは、For Each Row ループや列式に加えて、現在の行に依存します。
また、列として:
Print(NRows(dt<<GETROWSWHERE></GETROWSWHERE>
更新:使用する場合、方法#3が機能することに気付きました
Print(NRows(dt<<GETROWSWHERE></GETROWSWHERE>
それでも私には奇妙な振る舞いのように感じます。 もしもref = 列(dt, "ColName")は列参照を返しますが、なぜ [] が必要なのですか?
私は反対を期待するだろう - 以来ref = dt:ColName列の最初の値のみを返します。[] を使用する必要があると思いますGetRowsWhere(IsMissing(dt:ColName[])) Column(dt, "ColName") は既に列全体を返すので、なぜ [] が必要なのですか?