Ein Teil des Skripts wird nicht ausgeführt, es sei denn, er wird nachträglich ausgeführtIch habe einen Teil des Skripts, mit dem ich Spalten in meiner Tabelle neu codiere, um Werte von „X“ auf 0 zu ändern. Ich habe diesen Teil des Codes zum Laufen gebracht (Vielen Dank, JMP Discussion Forums!!), wenn ich ihn getrennt von meinem Hauptskript ausgeführt habe. Wenn ich dies jedoch in ein größeres Skript einfüge (auch ganz am Ende), führt JMP meinen Befehl nicht aus. Als der Code in der Mitte meines Skripts platziert wurde, wurde alles danach nicht ausgeführt. Also habe ich ihn an das Ende meines Hauptskripts verschoben, aber er wird immer noch nicht ausgeführt. Jedes Mal, wenn ich diesen Teil hervorhebe und ihn nachträglich ausführe, macht er genau das, was ich will.
Ich habe versucht, wait(0); zu implementieren, von i zu k zu wechseln und auch eine Try-Anweisung um For Each Row herum zu verwenden, aber kein Erfolg. Ich frage mich wirklich, warum es erst im Nachhinein funktionieren sollte. Vorschläge?
//Recode columns in Yield Table to give "0" instead of X's
wait(0);
yieldcols = Yields << get column names;
For Each Row( For( k = 1, k <= N Items( yieldcols ), k++,
If( Is Missing( As Column( yieldcols[k] )[] ),
As Column( yieldcols[k] )[] = 0 ) ) );
Erweiterte statistische ModellierungAutomatisierung und SkripterstellungDatenmischung und -bereinigungVersuchsplanungMassenanpassungBetreff: Ein Teil des Skripts wird nicht ausgeführt, es sei denn, er wird nachträglich ausgeführtHallo,
Ich bin mir nicht sicher, warum der von mir bereitgestellte Code bei Ihnen nicht funktioniert. Sie könnten Folgendes versuchen:
1) Führen Sie den Originalcode, den ich bereitgestellt habe, allein in einem neuen Fenster aus. Funktioniert es? Wenn nicht, welche JMP-Version verwenden Sie? Die direkte Indizierung von Datentabellen wurde vor einigen Versionen hinzugefügt, ist jedoch beispielsweise in JMP 12 nicht enthalten.
2) Unter der Annahme, dass 1) oben funktioniert, besteht der nächste Schritt darin, alle Instanzen von „dt“ durch „yields“ zu ersetzen und den neuen Code allein im neuen Fenster auszuführen. Das hat bei mir funktioniert und ich gehe davon aus, dass es auch bei Ihnen funktioniert, wenn 1) es bei Ihnen funktioniert.
Names Default To Here(1);
//create a table with roughly 10% missingness
yields = astable(J(1e5,5,randominteger(1, 20)/(randomuniform() > 0.1)));
For( i = 1, i <= N Col( yields ), i++,
yields[Loc( Is Missing( yields[0, i] ) ), i] = 0
);
3) Wenn die Daten in Ihrer Tabelle formelbasiert sind, wurden die Formeln möglicherweise in die Spalte „geschrieben“, sind aber möglicherweise noch nicht vollständig ausgewertet, wenn die JSL, die die fehlenden Fehler beheben soll, mit der Ausführung beginnt. Stellen Sie sicher, dass alle Formeln vollständig aktualisiert sind, bevor der Code ausgeführt wird, indem Sie dem Code diese Zeile voranstellen:
Yields << run formulas;
4) Stellen Sie sicher, dass „Yields“ auf nichts anderes als die Datentabelle von Interesse verweist, nicht auf einen Spaltennamen, einen anderen Variablennamen, eine Tabellenvariable usw. Aus diesem Grund empfehle ich als Best Practice die Verwendung von „dt“ irgendwo in jedem Variablennamen, der zum Verweisen auf eine Tabelle verwendet wird. Während man sich leicht vorstellen kann, ein Tabellenhandle „Yields“ zu überschreiben, indem man versehentlich eine Matrix oder einen Vektor von Werten „Yields“ nennt, ist es viel weniger wahrscheinlich, dass man eine solche Matrix oder einen solchen Vektor versehentlich „YieldDt“ nennt. Da Ihr Programm jedoch funktioniert, wenn Sie die Ausführung anhalten, glaube ich nicht, dass dies das Problem ist.
Wenn 1) und 2) für Sie funktionieren und weder 3) noch 4) das Problem beheben, benötige ich weitere Informationen, um Ihnen zu helfen: eine bereinigte Beispieltabelle und einen Codeausschnitt, der für diese Tabelle ausgeführt werden kann, um zu zeigen, dass die Der Ersatz funktioniert bei diesem Tisch nicht.
Prost,
Brady
Betreff: Ein Teil des Skripts wird nicht ausgeführt, es sei denn, er wird nachträglich ausgeführtHallo Mark. Dies läuft jetzt separat, funktioniert aber nicht als kleinerer Teil meines größeren Skripts. Ich frage mich, ob das weniger ein Skriptproblem ist, sondern eher ein anderes Problem. Warum funktioniert ein Codeabschnitt, wenn er alleine ausgeführt wird, und warum schlägt er fehl, wenn er als kleinerer Teil eines größeren Skripts ausgeführt wird (selbst wenn er wie im ersten Szenario zuletzt ausgeführt wird)?Betreff: Ein Teil des Skripts wird nicht ausgeführt, es sei denn, er wird nachträglich ausgeführtHallo Brady,
Ich bin für jeden Rat und jede Hilfe dankbar. Allerdings scheint dieser von Ihnen bereitgestellte Codeabschnitt bei mir nicht zu funktionieren (nachdem der Tabellenname geändert wurde). Ich finde das sehr seltsam – ich sehe keinen Grund, warum es nicht funktionieren sollte. Irgendwelche Ideen?
For( i = 1, i <= N Col( Yields ), i++,
Yields[Loc( Is Missing( Yields[0, i] ) ), i] = 0
);
Um meine Frage etwas umzuformulieren: Der Code, den ich derzeit habe, funktioniert, wenn er separat ausgeführt wird, aber nicht, wenn er als kleiner Abschnitt eines größeren Codes ausgeführt wird . Ich finde das an sich schon seltsam. Ich bin damit einverstanden, meinen Code zu ändern. Für mich scheint das nur nicht das Problem zu sein – weil es (wenn auch nicht „perfekt“) funktioniert! Könnte das ein Fehler sein? Oder gibt es Möglichkeiten, dieses Problem zu beheben? Auch beim Debuggen habe ich keine Fehler.
Betreff: Ein Teil des Skripts wird nicht ausgeführt, es sei denn, er wird nachträglich ausgeführtWenn Sie über mehrere Zeilen oder Spalten verfügen, binden Sie außerdem nrows (dt) oder ncols (dt) an eine Variable und verwenden Sie diese als oberen Index, sodass nrow(dt) oder ncol(dt) nicht bei jeder Iteration ausgewertet werden muss.
//do some stuff
);nc = ncol (dt);
for (i = 1, i<=nc, i++,
Mit JMP 16 können Sie dies mit einer for every( )-Schleife tun, nicht zu verwechseln mit for every row( ). For Each( ) hat einige weitere Vorteile gegenüber einfachen for( )-Schleifen, wie z. B. die lokale Festlegung des Gültigkeitsbereichs von Variablen und in manchen Fällen eine schnellere Ausführung. Wenn Sie JMP 16 verwenden, sollten Sie es unbedingt ausprobieren.
for each ( { i }, 1::nrow( dt ),
//do some stuff
);
Betreff: Ein Teil des Skripts wird nicht ausgeführt, es sei denn, er wird nachträglich ausgeführtLassen Sie mich außerdem als Erster zugeben, dass ich For Each Row() nie verwende.
Immer.
Auch nicht, wenn Kinder umsonst essen.
Wenn ich eine Schleife über Zeilen durchführen muss (was ich zu vermeiden versuche, indem ich die Werte einer Spalte auf einmal erfasse, entweder durch direkte Indizierung, wie ich es in diesem Beispiel mache, indem ich << get value verwende und die resultierende Liste oder Matrix bearbeite usw.) , Ich schreibe eine richtige for()-Schleife.
Ich sage nicht, dass For Each Row ( ) niemals funktioniert. Ich sage, dass es Vorbehalte gibt, und ich weiß nicht, was diese Vorbehalte sind. Deshalb vermeide ich For Each Row ( ) wie die Pest und empfehle anderen, dasselbe zu tun, es sei denn, sie sind beide 1) bereit, die Vorbehalte zu lernen, und 2) sind bereit anzunehmen, dass diejenigen, die den Code bearbeiten, pflegen oder auf andere Weise mit ihm interagieren die Zukunft wird es auch tun.
Letzteres ist so unwahrscheinlich, dass ich nie darüber nachgedacht habe, Ersteres in Angriff zu nehmen.
Prost,
Brady
for (i =1, i<=nrow(dt), i++,
//do some stuff
);
Betreff: Ein Teil des Skripts wird nicht ausgeführt, es sei denn, er wird nachträglich ausgeführtHallo,
Wenn die Leistung bei großen Tabellen ein Problem darstellt, können Sie Folgendes ausprobieren (beachten Sie, dass ich dt als Tabellennamen verwendet habe). Bei einer mittelgroßen Tabelle (100.000 Zeilen x 5 Spalten) ist der Leistungsunterschied auf meinem Computer mit 0,0056 Sekunden gegenüber 0,8261 Sekunden spürbar. Dies hat mehrere Gründe:
Erstens sind die Funktionen Loc ( ) und Is Missing ( ) schnell, selbst wenn sie für eine ganze Spalte auf einmal verwendet werden, was wir hier tun. Das heißt, dt[0, i] ruft die gesamte Spalte i ab.
Darüber hinaus müssen wir uns durch die direkte Indizierung der Spalten nicht darum kümmern, ihre Namen abzurufen oder sie aus der Liste, die sie enthält, abzurufen.
Prost,
Brady
Names Default To Here(1);
//create a table with roughly 10% missingness
dt = astable(J(1e5,5,randominteger(1, 20)/(randomuniform() > 0.1)));
For( i = 1, i <= N Col( dt ), i++,
dt[Loc( Is Missing( dt[0, i] ) ), i] = 0
);
Betreff: Ein Teil des Skripts wird nicht ausgeführt, es sei denn, er wird nachträglich ausgeführt//Recode columns in Yield Table to give "0" instead of X's
yieldcols = Yields << get column names;
For( col = 1, col <= N Items( yieldcols ), col++,
For Each Row( If( Is Missing( As Column( yieldcols[col] )[] ), As Column( yieldcols[col] )[] = 0 ) )
);
Betreff: Ein Teil des Skripts wird nicht ausgeführt, es sei denn, er wird nachträglich ausgeführtHabe es einfach mal ausprobiert. Dies funktioniert nicht, auch nicht, wenn es separat ausgeführt wird. Das ursprüngliche Skript, das ich habe, funktioniert, aber nur, wenn es separat ausgeführt wird (nachträglich, nachdem das gesamte Skript ausgeführt wurde und ich diesen einen Abschnitt mit Strg+R gedrückt habe).Betreff: Ein Teil des Skripts wird nicht ausgeführt, es sei denn, er wird nachträglich ausgeführt//Recode columns in Yield Table to give "0" instead of X's
yieldcols = Yields << get column names;
For( col = 1, col <= N Items( yieldcols ), col++,
For Each Row( If( Is Missing( As Column( yieldcols[k] )[] ), As Column( yieldcols[k] )[] = 0 ) )
);