後続の行は前の行とは異なる列に依存しますこんにちは - 私は一連の実験に取り組んでいますが、一部の実験は以前の実験に依存しています (つまり、以前に作成したソリューションを混合して新しいものを作成しています)。 列を読み取って前のソリューションの名前を取得し、2番目の列を検索してその名前の行を見つけ、その行と3番目の列のセルの値を取得する関数を作成しようとしています。 Match はこれをやっているように見えますが、私はそれを機能させることができません。これは、match が明示的に指定されたレベルの検索列を期待していることが原因の 1 つであり、おそらく私が気づいていない他のことも原因であると思います。 私は JSL の経験がまったくないので、マッチカラム関数のようなものを好みますが、JSL が必要なものであれば、それはまったく問題ありません。
他の無関係な列をすべて表示せずに要点を理解できるように、ダミーの表を添付しました。 最後の列は失敗している数式を含む列です。これがスクリーンショットです。

対処しやすい場合は、動作していない部分のコードも表示します。
Match( :溶液名, :希釈に使用した溶液, :与えられた濃度 ) /
:希釈率
前もって感謝します。
自動化とスクリプト作成ウィンドウズRe: 後続の行が前の行とは異なる列に依存する1 つのオプションは、このようなものを使用してインデックスを取得することです
row_idx = Loc(:Letters << Get Values, :Used solution for dilution);
If(N Items(row_idx) < 1,
.,
row_idx[1]
);
それなら使えますデータテーブルの添字付け行固有の行の値にアクセスします。 最終的な式は次のようになります
row_idx = Loc(:Letters << Get Values, :Used solution for dilution);
If(N Items(row_idx) < 1,
.,
:Given Concentration[row_idx[1]] / :Dilution Factor
);
Re: 後続の行が前の行とは異なる列に依存するこれが私が思いついた公式です。簡素化できるかもしれませんが、現在の形式でも機能するようです。
x = .;
If( :Used solution for dilution[Row()] != "",
curRow = Row();
targetRow = (Current Data Table() << get rows where(
:Letters == :Used solution for dilution[curRow]
))[1];
x = :Given Concentration[targetRow] / :Dilution Factor[curRow];
);
x;
Re: 後続の行が前の行とは異なる列に依存するおい@jthi - これはうまくいきました! JSL に関わるのは初めてなので、何が起こっているのかを完全には推測したくありません。そのため、ロジックを理解しています。
1. :Column1 << Get Values は、内容と順序が :Column1 と同じ一時リストを作成します。
2. Loc(:Column2 << Get Values, :Column2) は、:Column1 が :Column2 の各行の内容と一致するすべての行番号の順序付きリストを返します。 それを row_idx に割り当てます。
if ステートメント内では、
3. N Items( row_idx ) < 1 は、リストが null の場合 (つまり、一致するものが存在しない場合)、「.」を入れて空白にすることを示します。で、
4. row_idx リストに 1 以上のエントリがある場合、:Column3[row_idx[1]] はインデックスのインデックスであり、row_idx リストの最初のエントリを取得し、そのエントリを n 番目のエントリとして使用します。の:列3。
それが要点ですか?
ご協力いただきありがとうございます!
Re: 後続の行が前の行とは異なる列に依存する@txnelsonコードをありがとうございます。あなたも頑張ったね! 私には JSL の経験がなく、VBA と Matlab でしか作業したことがありません。 @jthi 、理解したいです。 だから私が理解していることを確認するために
1.x=。空の変数 x を定義するだけです。
2. 評価対象と同じ行に「希釈に使用した溶液」の空白でないセルがある場合 =>
3. curRow = Row() は、curRow を現在の行番号として定義します。
4. 行を取得します。
:溶液名 == :希釈に使用した溶液[curRow]
))[1]
インデックスとして使用して、現在の行の希釈に使用されたソリューションの値を取得し、「get[s] row[numbers] where」これらの値は :Solution の値と同一です。
5. targetRow = (Current Data Table() << get rows where(... 次に、ステップ 3 で決定された行から行列を作成します。添字 1 は、この行列の最初のエントリを取得します。
6. 最後に、4 で指定した :Given Concentration の行を、3 で指定した現在の行の :Dilution Factor で割ることによって x が埋められます。
7. セルに「x」を返します。
私の 1 つの質問はステップ 5 からのものです。targetRow は必要な行の各エントリのリストだと思いますが、ステップ 6 が機能するには実際の行番号を返す必要があります。 Current Data Table () << get rows where(... がどのように機能するかを誤解しているようです。 詳しく教えていただけますか?
お時間を割いていただきありがとうございます。
Re: 後続の行が前の行とは異なる列に依存する<< Get Rows Where() は、関数に渡された選択基準に一致する行の行列を返します。
したがって、行の「希釈に使用した溶液」列の値が空白または欠落していないことが判明した場合、
- メモリ変数 curRow は、処理中の現在の行 Row() に設定されます。この場合、curRow は 6 に設定されます。
- targetRow は、「希釈に使用した溶液」の現在の行値を持つ、「文字」列に一致する値を持つ行の「所定の濃度」を含む行に設定する必要があります。
- 解析すると、Get Rows Where は次のようになります。
<< get rows where(:Letters == :"C"])
この関数では複数の行を返すことができるため、選択基準に一致するすべての行番号の行列が返されます。この例では、単一要素の行列が返され、最初の要素の値 3 (列の文字が「C」に等しい行の行番号) が必要です。
Re: 後続の行が前の行とは異なる列に依存する<< Get Values は、列からリストまたは行列 (データ型に応じて) に値を取得するために使用されます。
ロック()提供する項目に一致する行列/リストからインデックスを取得するか、欠損していない値のインデックスを返すために使用できます (私の意見では、知っておくと非常に良い関数です)。
Loc は行列を返すため、N Items() を使用してインデックスが見つかったかどうかを確認し、インデックスにアクセスする際の問題を回避します。 インデックスが見つからない場合は、それらの行の値を「.」が欠落しているものとして設定します。
提供されたデータに基づいて、インデックスの最初のインデックスを常に使用することを選択しました。 複数の一致の場合にさらに複雑な計算が必要な場合は、それらをすべて使用することができます。
以下は数式の作成といくつかのコメントです
Names Default To Here(1);
dt = New Table("Calculated concentration - Dummy table",
Add Rows(6),
Compress File When Saved(1),
New Column("Given Concentration", Numeric, "Continuous", Format("Best", 12), Set Property("Units", "ppm"), Set Values([12, 50, 23, 14, 2, .])),
New Column("Letters", Character(1), "Nominal", Set Values({"A", "B", "C", "D", "E", "F"}), Set Display Width(38)),
New Column("Used solution for dilution", Character, "Nominal", Set Values({"", "", "", "", "", "C"})),
New Column("Dilution Factor", Numeric, "Continuous", Format("Best", 12), Set Values([., ., ., ., ., 2.29837984]))
);
dt << New Column("Calculated Concentration (ppm)", Numeric, Continuous, Formula(
// use As Constant to evaluate this only once (should make it more efficient if you have lots of data)
As Constant(all_letters = :Letters << get values); // << get values gets values from column into a matrix or list
idx_for_letter = Loc(all_letters, :Used solution for dilution); // Loc can be used to return indices of matches in matrix but it has many other uses
If(N Items(idx_for_letter) == 0, // to avoid issues when trying to access incorrect indices, check for empty matrix
. // set missing value to column IF no indices found
,
:Given Concentration[idx_for_letter[1]] / :Dilution Factor // perform calculation using first index found from idx_for_letter
);
));
使用されている関数の説明を取得するには、まず Scripting Index を使用して関数を検索し、次に「トピック ヘルプ」をクリックしてヘルプ ページにアクセスすることをお勧めします。 たとえば、「as constant」を検索します。

トピックのヘルプをクリックしてこのページを開きます定数として(expr)