Les lignes suivantes dépendent de colonnes différentes des lignes précédentesBonjour - Je travaille avec un ensemble d'expériences où certaines expériences dépendent d'expériences précédentes (c'est-à-dire que je mélange des solutions que j'ai déjà faites pour en créer de nouvelles). J'essaie de créer une fonction dans laquelle elle lit une colonne pour obtenir le nom de la solution précédente, recherche une deuxième colonne pour trouver la ligne portant ce nom, puis prend la valeur dans une cellule avec cette ligne et une troisième colonne. Match semble en quelque sorte faire cela, mais je n'arrive pas à le faire fonctionner, et je pense que c'est en partie parce que match attend un niveau explicitement indiqué de la colonne de recherche, et peut-être d'autres choses que je ne réalise pas. Je ne suis pas du tout expérimenté en JSL et je préférerais quelque chose comme une fonction de colonne de correspondance, mais si JSL est ce que cela prend, alors c'est tout à fait bien.
J'ai joint un tableau factice qui devrait faire passer le message sans voir toutes mes autres colonnes superflues. La dernière colonne est celle avec la formule qui échoue, et voici une capture d'écran

et le code de ce qui ne fonctionne pas si c'est plus facile à gérer :
Match( :Nom de la solution, :Solution utilisée pour la dilution, :Concentration donnée) /
:Facteur de dilution
Merci d'avance.
Automatisation et scriptles fenêtresRe : Les lignes suivantes dépendent de colonnes différentes des lignes précédentesUne option consiste à utiliser quelque chose comme ça pour obtenir l'index
row_idx = Loc(:Letters << Get Values, :Used solution for dilution);
If(N Items(row_idx) < 1,
.,
row_idx[1]
);
alors vous pouvez utiliser Abonnement aux tables de données pour accéder à la valeur sur la ligne spécifique à la ligne. Donc la formule finale est quelque chose comme ça
row_idx = Loc(:Letters << Get Values, :Used solution for dilution);
If(N Items(row_idx) < 1,
.,
:Given Concentration[row_idx[1]] / :Dilution Factor
);
Re : Les lignes suivantes dépendent de colonnes différentes des lignes précédentesVoici la formule que j'ai trouvé.Il peut être simplifié, mais dans sa forme actuelle, il semble fonctionner.
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 : Les lignes suivantes dépendent de colonnes différentes des lignes précédentesHé @jthi - Cela a fonctionné ! Juste pour comprendre la logique, puisque c'est la première fois que je m'engage avec JSL, et je préfère ne pas déduire complètement ce qui se passe:
1. le :Column1 << Get Values crée une liste temporaire dont le contenu et l'ordre sont identiques à :Column1.
2. Loc(:Column2 << Get Values, :Column2) donne alors une liste ordonnée de tous les numéros de ligne où :Column1 correspond au contenu de chaque ligne dans :Column2. Nous attribuons cela à row_idx.
Dans l'instruction if,
3. N Items( row_idx ) < 1 indique que si la liste est nulle (c'est-à-dire qu'il n'y a pas de correspondance), nous la rendons vide en mettant un "." dans,
4. S'il y a une entrée supérieure ou égale à 1 dans la liste row_idx, :Column3[row_idx[1]] est un index d'un index, où nous prenons la première entrée dans la liste row_idx, utilisez cette entrée comme nième entrée de :Colonne3.
C'est ça l'essentiel ?
Merci d'avoir travaillé dessus !
Re : Les lignes suivantes dépendent de colonnes différentes des lignes précédentes@txnelson Merci pour le code ; votre a travaillé aussi! Je n'ai aucune expérience avec JSL, aucun n'a travaillé avec VBA et Matlab, donc comme avec @jthi , Je veux comprendre. Donc pour être sûr d'avoir bien compris
1.x=. définit juste une variable vide x.
2. S'il y a des cellules de : Solution utilisée pour la dilution dans la même ligne que celle en cours d'évaluation qui ne sont pas vides =>
3. curRow = Row() définit curRow comme le numéro de ligne actuel
4. obtenir des lignes où (
:Nom de la solution == :Solution utilisée pour la dilution[curRow]
))[1]
récupère la valeur des solutions :Used pour la dilution de la ligne actuelle en l'utilisant comme index, et "get[s] row[numbers] where" ces valeurs sont identiques à celles de :Solution.
5. targetRow = (Current Data Table() << get rows where(... puis crée une matrice à partir des lignes déterminées à l'étape 3, l'indice 1 saisit la première entrée de cette matrice, .
6. Enfin x est rempli en divisant la ligne de :Given Concentration que nous avons spécifié en 4, par le :Dilution Factor dans la ligne actuelle, spécifié en 3.
7. Nous renvoyons "x" à la cellule.
Ma seule question concerne l'étape 5, je pense que targetRow est une liste de chaque entrée dans la ligne que nous voulons, mais pour que l'étape six fonctionne, elle doit renvoyer le numéro de ligne réel. Je pense que je comprends mal comment le tableau de données actuel () << get rows where(... fonctionne. Pourriez-vous élaborer?
Merci encore d'avoir pris le temps !
Re : Les lignes suivantes dépendent de colonnes différentes des lignes précédentes<< Get Rows Where() renvoie une matrice des lignes correspondant aux critères de sélection transmis à la fonction.
Ainsi, lorsqu'une ligne contient une valeur pour la colonne "Solution utilisée pour la dilution" n'est pas vide/manquante,
- La variable de mémoire, curRow, est définie sur la ligne actuelle, Row(), en cours de traitement.Dans ce cas, curRow sera défini sur 6.
- targetRow, doit être défini sur la ligne qui contient la "Concentration donnée" de la ligne qui a une valeur correspondante dans la colonne "Lettres", avec la valeur de la ligne actuelle pour "Solution utilisée pour la dilution".
- Une fois analysé, Get Rows Where est :
<< get rows where(:Letters == :"C"])
La fonction permet de renvoyer plusieurs lignes, par conséquent, elle renvoie une matrice de tous les numéros de ligne qui correspondent aux critères de sélection.Dans notre cas, une seule matrice d'élément sera renvoyée et nous voulons la valeur du premier élément, qui est 3, le numéro de ligne de la ligne, où la colonne Letters est égale à "C"
Re : Les lignes suivantes dépendent de colonnes différentes des lignes précédentes<< Get Values est utilisé pour obtenir les valeurs d'une colonne dans une liste ou une matrice (selon le type de données).
Loc() peut être utilisé pour obtenir les indices de la matrice/liste qui correspondent à l'élément que nous lui fournissons OU renvoyer des indices de valeurs non manquantes (très bonne fonction à connaître à mon avis).
Loc renverra une matrice, nous utilisons donc N Items() pour vérifier s'il y a des index trouvés pour éviter les problèmes lors de l'accès aux index. Si aucun index n'est trouvé, nous définissons la valeur de ces lignes comme manquante ".".
Sur la base des données fournies, j'ai choisi de toujours utiliser le premier index des index. Il est possible de les utiliser tous si des calculs plus compliqués étaient nécessaires en cas de correspondances multiples.
Ci-dessous la création de la formule avec quelques commentaires
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
);
));
Pour obtenir des explications sur les fonctions utilisées, je suggérerais d'abord d'utiliser l'index de script pour rechercher la fonction, puis de cliquer sur "Aide du sujet" pour accéder à la page d'aide. Par exemple, recherchez "comme constant"

et cliquez sur l'aide du sujet pour ouvrir cette page Comme Constante(expr)