Betreff: For-Schleifenvariable in einer Formel verwendenEin paar Probleme
Der
Column[ l ]
Die von Ihnen angegebene Syntax ist falsch.Die Spalte ist eine Funktion (), keine Matrix [], daher muss sie als angegeben werden
Column( l )
Als nächstes wird die Formel ein Problem mit dem Wert haben, den Sie zuweisen.Aufgrund Ihrer Formel gibt es Fälle, in denen kein Wert zugewiesen wird.Da eine JMP-Formel den zuletzt zugewiesenen Wert zurückgibt, müssen Sie der Formel für jeden Fall explizit einen Wert zuweisen.In meiner Version Ihrer Formel verwende ich eine Variable X, um Ihre Logik zuzuweisen.Ich initialisiere den Wert auf einen fehlenden Wert und dann wird X von Ihrer If()-Logik zugewiesen.Ich stelle dann durch einfaches Addieren sicher, dass der berechnete Wert von X der zuletzt verarbeitete Wert ist
x;
als letzte Aussage in der Formel.
For( k = 40, k <= 54, k += 2,
x1 = 1;
x2 = 8;
y1 = 40;
y2 = 54;
m = (y2 - y1) / (x2 - x1);
c = y2 - (m * x1);
l = (k - c) / m;
dt << New Column( "Test" || Char( k ),
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
x = .;
If( :Strobe == 1,
If(
:Tested Variable == 0 | :Tested Plane == 1,
If( Left( Right( :"x"n, Column(l) ) ),
1
) == "1",
x = 1,
Left( Right( :"x"n, (l) ), 1 ) == "0",
x = 0,
),
);
x;
)
);
)
Wenn Sie schließlich JSL in eine Diskussionsfrage eingeben, verwenden Sie bitte das
Symbol, damit die JSL für die Community-Mitglieder leichter lesbar ist
Verwenden Sie eine for-Schleifenvariable in einer FormelIch versuche es mit diesem Skript, aber die Variable „l“ funktioniert nicht, sondern nur die Variable „k“. Wie kann man das irgendwie lösen?
For( k = 40, k <= 54, k += 2,
x1 = 1;
x2 = 8;
y1 = 40;
y2 = 54;
m = (y2 - y1) / (x2 - x1);
c = y2 - (m * x1);
l = (k - c) / m;
dt << New Column( "Test" || Char( k ),
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
If( :Strobe == 1,
If(
:Tested Variable == 0 | :Tested Plane == 1,
If( Left( Right( :"x"n, Column[l] ) ), 1 ) == "1",
1, Left( Right( :"x"n, (l) ), 1 ) == "0",
0,
),
)
)
);
)Automatisierung und SkripterstellungBetreff: For-Schleifenvariable in einer Formel verwendenOk, klar, ich werde das Symbol für das nächste Mal verwenden. Übrigens funktioniert das Skript nicht. Vielleicht sollte ich näher erläutern, mit welchen Problemen ich konfrontiert war
Ich habe eine Spalte mit einer 8-Bit-Binärzahl, zum Beispiel x="00101101"
Wenn dann meine Variable k unterschiedlich ist, sollte das aus Spalte x ausgelesene Bit unterschiedlich sein
\\k start 40, For each loop will add 2
For( k = 40, k <= 54, k += 2,
x1 = 1;
x2 = 8;
y1 = 40;
y2 = 54;
m = (y2 - y1) / (x2 - x1);
c = y2 - (m * x2);
l = (k - c) / m;
\\l is calculated based on k\
\\Tested variable & Column x & Strobe are the column in my data set
\\If k=40, then the readout will be 1st bit from the right of column x;
\\If k=40, then the readout will be 8th bit from the right of column x;
dt << New Column( "Test" || Char( k ),
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
If( :Strobe == 1,
If(
:Tested Variable == 0 | :Tested Variable == 1,
If( Right( :"x"n, Column(l) ) ) == "1",
1, Right( :"x"n, (l) )== "0",
0,
),
)
)
);
)Das Problem, mit dem ich konfrontiert war, ist, dass jmp nicht erkennen kann, welches Bit ich auslesen möchte, unabhängig davon, ob ich Column(l), l in die for-Schleife eingefügt habe
Betreff: For-Schleifenvariable in einer Formel verwendenEs wäre hilfreich, wenn Sie eine Beispieldatentabelle beifügen könnten.
Versuchen Sie mit Ihrer weiteren Erklärung eine Änderung
If( Right( :"x"n, Column(l) ) ) == "1"
Zu
If( Right( :"x"n, as Column( "Column" || char(l) )== "1"
Betreff: For-Schleifenvariable in einer Formel verwendenHallo Jim, hier ist die Datentabelle. Ich habe das, was ich erwarte, in die Datentabelle eingetragen. Die Spaltendaten beschreiben, was der „l“-Wert ist und von welchem Wert von „x“ er stammt
Betreff: For-Schleifenvariable in einer Formel verwendenDanke Jim, ich denke, es funktioniert, aber der Ausdruck wird leicht abweichen. Es funktioniert gut, wenn in der Formel „,1“ hinter „_l_“ hinzugefügt wird. Ich habe hier mein vollständiges JSL-Skript angehängt
Names Default To Here( 1 );
dt = Current Data Table();
//k start 40, For each loop will add 2
For( k = 40, k <= 54, k += 2,
x1 = 1;
x2 = 8;
y1 = 40;
y2 = 54;
m = (y2 - y1) / (x2 - x1);
c = y2 - (m * x2);
l = (k - c) / m;
//l is calculated based on k\
//Tested variable & Column x & Strobe are the column in my data set
//If k = 40;, then the readout will be 1st bit from the right of column x;
//If k = 40;,then the readout will be 8th bit from the right of column x;
// The variable l needs to be fully parsed in the formula, so that if the
// value of l changes, it does not change previous formulas
Eval(
Substitute(
Expr(
dt << New Column( "Test" || Char( k ),
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
theVal = .;
If( :Strobe == 1,
If( :Tested Variable == 0 | :Tested Variable == 1,
theVal = Num( Substr( :x, _l_ ,1) )
)
);
theVal;
)
)
),
Expr( _l_ ), l
)
);
);Betreff: For-Schleifenvariable in einer Formel verwendenDu hast recht, das ist mein Fehler.Ich werde meine Eingabe korrigieren.
Betreff: For-Schleifenvariable in einer Formel verwendenDas folgende Skript scheint zu funktionieren.Ihr bereitgestelltes Skript verwendet \\ als Kommentarinitiatoren, wobei // die korrekte Syntax ist.
Die eigentliche Arbeitsformel lief im Wesentlichen auf die Verwendung der Substr()-Funktion hinaus.
Durch das Hinzufügen des Abschnitts Eval(Substitute(Expr())) wurde lediglich der Wert Ihrer l-Variablen in den tatsächlichen Wert von l geändert, anstatt dass der Wert über die Variable referenziert wurde.
Names Default To Here( 1 );
dt = Current Data Table();
//k start 40, For each loop will add 2
For( k = 40, k <= 54, k += 2,
x1 = 1;
x2 = 8;
y1 = 40;
y2 = 54;
m = (y2 - y1) / (x2 - x1);
c = y2 - (m * x2);
l = (k - c) / m;
//l is calculated based on k\
//Tested variable & Column x & Strobe are the column in my data set
//If k = 40;, then the readout will be 1st bit from the right of column x;
//If k = 40;,then the readout will be 8th bit from the right of column x;
// The variable l needs to be fully parsed in the formula, so that if the
// value of l changes, it does not change previous formulas
Eval(
Substitute(
Expr(
dt << New Column( "Test" || Char( k ),
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
theVal = .;
If( :Strobe == 1,
If( :Tested Variable == 0 | :Tested Variable == 1,
theVal = Num( Substr( :x, _l_ , 1 ) )
)
);
theVal;
)
)
),
Expr( _l_ ), l
)
);
);