Formeln verketten und unterdrückenLeute,
Ich habe mehrere Tabellen (Beispiele), die viele aktive Spaltenformeln enthalten. Mein Skript verkettet irgendwann alle Tabellen. Ich möchte jedoch, dass die Formeln unterdrückt werden, da ich die einzelnen Tabellendaten (Beispiel) intakt halten möchte, um alle verketteten Daten vergleichen/überlagern zu können. Leider kann ich die verketteten Formeln nicht richtig deaktivieren, und die neu verketteten Spalten werden ausgewertet, wodurch die einzelnen Beispieldaten verloren gehen. Ich dachte, ich hätte diesen Fehler mit dem angehängten Code, aber als ich die ursprüngliche Tabelle erneut in einen anderen Ordner kopierte, wurden die Formeln „reaktiviert“, was zu einiger Frustration führte. Wenn es eine gute Lösung gibt, bin ich für jede Eingabe offen, da die Formelauswertung unterdrücken in der aktuellen Implementierung nicht funktioniert.
Neil
Con = Expr(
n = N Table();
dt = {};
// Sort list ascending (sample replicates)
For( i = 1, i <= n, i++,
table = data table(i);
insert into(dt, table);
sort list into(dt)
);
// Concatenate each file (sample replicates)
dt_all = Data Table( dt[1] );
For(i = 1, i <= n, i++,
If(i > 1,
Suppress Formula Eval(suppress=1);
dt_all << Concatenate(Invisible, dt[i], Append to first table);
)
);
Current Data Table(dt_all);
);
DatenzugriffQualitäts- und VerfahrenstechnikBetreff: Formeln verketten und unterdrückenJarno,
Toller Beitrag. Tatsächlich habe ich gestern Abend angefangen, mir die Route „Ist leer“ anzuschauen. Um die Diskussion über die Eliminierung von Formeln und die Verkettung abzuschließen, habe ich Ihre Vorschläge aufgegriffen und meine Fähigkeiten durch Codierung Ihrer Vorschläge aktualisiert. Darüber hinaus habe ich gemäß meinem ursprünglichen Beitrag und Code Aktualisierungen vorgenommen, die ebenfalls funktionierten.
- Im ersten Block wird die Anweisung „Ist leer“ verwendet, um KEINE Formelspalten herauszusuchen und nur die Formeln des Rests zu entfernen.
- Der zweite Block verwendet „Try“, was ich zunächst nicht ganz verstanden habe, als Sie es vorgeschlagen haben, selbst nachdem ich mir den Skriptindex angesehen habe. Ich dachte, die Hinrichtung würde wie bei früheren Versuchen aufhören, aber offensichtlich war das nicht der Fall.
- Der dritte Block verwendet „Formelauswertung unterdrücken“ für die erste geöffnete Tabelle. Alle anderen Tabellen werden mit dieser ersten Tabelle verkettet, was auch zu einer gewünschten Ausgabe führt, bei der die endgültigen verketteten Tabellenspalten nicht ausgewertet werden.
Ich kann Ihnen nicht genug für all Ihre Beiträge danken, die mir dabei geholfen haben, meine Fähigkeiten zu verbessern.
Neil
For( i=1, i <= N Items(b), i++,
If(i==1,
file_1 = Open(SD1 || b[1]);
CN = file_1 << get column names(numeric);
For(j=1, j <= N Items(CN), j++,
result = Column(file_1, CN[j]) << Get Formula;
y = Is Empty(result);
If(y==0, Column(file_1, CN[j]) << delete formula);
);
);
If(i > 1,
file_nxt = Open(SD1 || b[i], Private);
file_1 << Concatenate(file_nxt, append to first table);
Close(file_nxt, no save);
);
);
file_1 << Save(SD1 || "All Summary");
Close("All Summary");For( i=1, i <= N Items(b), i++,
If(i==1,
file_1 = Open(SD1 || b[1]);
CN = file_1 << get column names(numeric);
For(j=1, j <= N Items(CN), j++,
Try(Column(file_1, CN[j]) << delete formula);
);
);
If(i > 1,
file_nxt = Open(SD1 || b[i], Private);
file_1 << Concatenate(file_nxt, append to first table);
Close(file_nxt, no save);
);
);
file_1 << Save(SD1 || "All Summary");
Close("All Summary");For( i=1, i <= N Items(b), i++,
If(i==1,
file_1 = Open(SD1 || b[1]);
file_1 << Suppress Formula Eval(1);
);
If(i > 1,
file_nxt = Open(SD1 || b[i], Private);
file_1 << Concatenate(file_nxt, append to first table);
Close(file_nxt, no save);
);
);
file_1 << Save(SD1 || "All Summary");
Close("All Summary");Betreff: Formeln verketten und unterdrückenWenn Sie die Formeln nicht unbedingt benötigen, müssen Sie sie nicht einmal erstellen, da Sie „<< Set Each Value“ anstelle von „Formel“ verwenden können (oder Formeln sofort nach der Erstellung entfernen). Wenn Sie sie jedoch benötigen, können Sie mit << Formel abrufen überprüfen, ob die Spalte eine Formel enthält. Wenn das Ergebnis Empty() ist, ist die Formel nicht vorhanden (verwenden Sie IsEmpty(), um nach fehlenden Formeln zu suchen), oder Sie könnten „Brute Force“ anwenden " es mit Try-catch.
Formel abrufen:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
col = New Column("Ratio");
result = col << Get Formula;
Show(result, IsEmpty(result));
col << Set Formula(:Height / :Weight);
col << Eval Formula;
result = col << Get Formula;
Show(result, IsEmpty(result));
Try-Catch:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
col = New Column("Ratio");
Try(col << Delete formula, show(exception_msg)); //the show part isn't necessary
Wenn Sie dann nur eine Schleife über Spalten mit Formeln durchlaufen möchten, können Sie die Liste durchlaufen und eine neue erstellen (wenn Sie JMP16 haben, verwenden Sie Filter Each).
Es gibt auch einige Beiträge in der Community darüber, wie man alle Formeln in der Tabelle entfernt, hier ist zum Beispiel einer: Suchen und löschen Sie alle in einer Tabelle vorhandenen Formeln
Betreff: Formeln verketten und unterdrückenJarmo,
Vielen Dank für die Aufklärung des Themas. Mir war nicht klar, dass es ohne eine vorhandene Formel ein Problem geben würde. Vor diesem Hintergrund habe ich eine bedingte Anweisung für die erste Tabelle erstellt. Dies hat offensichtlich funktioniert, da bei „file_1“ die spezifische Spaltenformel einmal gelöscht wurde. Der beigefügte Code funktionierte für das einspaltige Beispiel.
Da nun klar ist, dass eine Formel vorhanden sein muss, besteht das Problem darin, dass nicht alle Spalten Formeln enthalten. Wenn ich also alle Spaltennamen abrufe, gibt es eine Teilmenge, der keine Spalten zugeordnet sind. Gibt es eine Möglichkeit zu testen, ob eine Spalte eine Formel hat, damit eine richtige Liste für die Schleife erstellt werden kann? Oder erzwinge ich das Problem einfach, indem ich in JSL eine Liste einrichte, die ich jedes Mal aktualisieren muss, wenn ich einer Spalte eine Formel hinzufüge?
Neil
For( i=1, i <= N Items(b), i++,
If(i==1,
file_1 = Open(SD1 || b[1]);
file_1:"Pore Diameter (um)" << delete formula;
);
If(i > 1,
file_nxt = Open(SD1 || b[i], Private);
file_1 << Concatenate(file_nxt, append to first table);
Close(file_nxt, no save);
);
);
file_1 << Save(SD1 || "All Summary");
Close("All Summary");
Betreff: Formeln verketten und unterdrückenSind Sie sicher, dass Sie versuchen, auf die richtige Datentabelle zuzugreifen? Sie öffnen immer dieselbe Datei wie Datei_1 in der for-Schleife.
Sie könnten einige Debug-Ausdrücke in die for-Schleife einfügen, um herauszufinden, wo das Problem liegt, wie zum Beispiel:
file_1 = Open(SD1 || b[1]);
show(file_1);
show(file_1 << Get Column Names("String")); //depending how many columns you have might not want to do this
show(Contains(file_1 << Get Column Names("String"), "Pore Diameter (um)"));
file_1:"Pore Diameter (um)" << delete formula;Denken Sie auch daran, Datentabellen, die Sie nicht mehr benötigen, mit Close(dtref, no save); zu schließen.
Betreff: Formeln verketten und unterdrückenEntschuldigung für die späte Antwort. Ich freue mich über jedes Feedback.
Ohne bisher alle Spalten anzugreifen, habe ich einfach versucht, eine Formel in einer bestimmten Spalte zu entfernen. Wenn ich die Zeile „Formel löschen“ außerhalb der Schleife anwende, erhalte ich das gewünschte Ergebnis, nämlich, dass keine Formel vorhanden ist. Wenn jedoch dieselbe Zeile innerhalb der Schleife steht, erhalte ich nach dem Öffnen der Datei die folgende Fehlermeldung:
„Säulenporendurchmesser (um) hat keine Formel im Zugriff oder in der Auswertung von ‚Formel löschen‘, Formel löschen/*###*/“
Offensichtlich habe ich noch nicht das nötige Verständnis für die Mechanik, um zu verstehen, warum es ein Problem gibt. Könnten Sie uns einen Einblick geben?
Vielen Dank.
For( i=1, i <= N Items(b), i++,
file_1 = Open(SD1 || b[1]);
file_1:"Pore Diameter (um)" << delete formula;
If(i > 1,
file_nxt = Open(SD1 || b[i], Private);
file_1 << Concatenate(file_nxt, Append to first table);
);
);
//file_1:"Pore Diameter (um)" << delete formula;
file_1 << Save(SD1 || "All Summary");
Close("All Summary");Betreff: Formeln verketten und unterdrückenJMP kann dies auch interaktiv mit Standardize Attributes tun:
Wählen Sie alle Spalten aus, klicken Sie mit der rechten Maustaste auf eine der Spalten und wählen Sie Attribute standardisieren:

Fügen Sie Formel hinzu, um Eigenschaften zu löschen, und klicken Sie auf OK (oder Übernehmen):

Wenn Sie JMP16 haben, wird dies im erweiterten Protokoll ausgedruckt:
// Open Data Table: Wheat.jmp
// → Data Table("Wheat")
Open("$SAMPLE_DATA/Wheat.jmp");
// Standardize column attributes
Local({old dt = Current Data Table()},
Current Data Table(Data Table("Wheat"));
For Each({col, index},
{:Variety, :Yield, :Moisture, :Pred Formula Yield, :Cond Pred Formula Yield},
col << Delete Formula
);
Current Data Table(old dt);
);
Und dies wird eine gute Vorstellung davon geben, wie man damit umgeht (wie Txnelson sagte, durchlaufen Sie die Liste und löschen Sie dabei Formeln). Sie können auch alle Spalten in der Tabelle mit << Spaltennamen abrufen abrufen. Sie können keine Formeln aus Spalten entfernen, in denen sie nicht vorhanden sind (und das vom erweiterten Protokoll bereitgestellte Skript funktioniert so nicht direkt), aber Sie können dies umgehen, indem Sie die col << Formel löschen mit Try() umschließen. Nachdem Sie das erweiterte Protokollskript bereinigt haben, erhalten Sie möglicherweise Folgendes:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Wheat.jmp");
For Each({col}, dt << get column names(String),
Try(Column(dt, col) << Delete Formula)
);Betreff: Formeln verketten und unterdrückenSie können die Spaltennamen in eine Liste einfügen und dann die Liste durchlaufen und jeden einzelnen löschen.
Betreff: Formeln verketten und unterdrückenJim,
Danke für die Antwort. Gibt es einen „pauschalen“ Ansatz, um alle auf einmal zu löschen, da es pro Tabelle etwa 10 Spalten mit Formeln gibt?
Neil
Betreff: Formeln verketten und unterdrückenSie müssen die Formeln vor der Verkettung löschen.Dadurch werden die Werte in statische Werte konvertiert, und dann treten keine Probleme mehr auf.
:yourColumn << delete formula;