Variablen werden nicht zwischen Skripten übergebenHallo,
Ich verwende ein Skript aus dem folgenden Post um zu versuchen, die aus dem Skript erstellte Heatmap zu erweitern. Das Skript in seiner aktuellen Form erstellt eine Heatmap für alle Spalten zusammen, aber ich möchte eine separate Heatmap PRO Spalte. Mit anderen Worten, ich möchte das Minimum, die Mitte und das Maximum für eine bestimmte Spalte finden, dann eine Heatmap nur auf diese Spalte anwenden, dann dasselbe für die nächste Spalte tun und fortfahren.
Im Anhang sind die folgenden
1. sample_base_table.jmp: Dies ist ein Beispieldatensatz, aus dem extrahiert wird.
2. extract_cols.jsl: Dies ist das Skript, das die Daten zusammenfasst, die für das Heatmap-Skript verwendet werden sollen
3. heatmap.jsl: Dieses Skript erstellt die Heatmap für die angegebenen Spalten
Themen:
Wenn ich extract_cols.jsl ausführe, erhalte ich 4 neue Datentabellen mit dem Namen "Untitled X". Wenn ich dann heatmap.jsl ausführe, kann es nur eine Heatmap für die zuletzt erstellte unbenannte X-Tabelle erstellen. Ich verstehe nicht, warum das so ist... Wenn ich mir den Debugger-Code ansehe, heißt es: "Spalte konnte nicht im Zugriff oder in der Auswertung von 'Spalte' gefunden werden". Ich drucke jedoch die verwendete Spalte "Median (Werte, Mango)" und sie wird angezeigt, sodass ich nicht sicher bin, was passiert (siehe Ausgabebild unten).

Verbesserungen/Zukünftige Arbeiten:
Idealerweise, nachdem ich herausgefunden habe, warum nur die zuletzt erstellte Datentabelle aktualisiert wird, möchte ich alle diese 4 Heatmap-Spalten von Früchten in einer Datentabelle verketten, die auch die Länder- und Fruchtinformationen enthält. Mit anderen Worten, ich generiere 4 (32x3) Tabellen und ich möchte 1 (6x32) Tabelle generieren (4 Frucht-Heatmap + Länderspalte + Standortspalte). Derzeit arbeite ich mit JMP Query Builder, um die Spaltenverkettung durchzuführen.
DatentabelleSkripterstellungBetreff: Variablen werden nicht zwischen Skripten übergebenWenn Sie den Mauszeiger über trans:theList bewegen oder wenn Sie angeben
show(trans:theList);
In Ihrem Skript wird es Ihnen zeigen, was in der Liste steht.Was Sie sehen werden, sind 5 Einträge.Der erste wird
Data Table( 'the name of your initial data table");
Jeder Eintrag danach ist der Zeiger auf den Datentabellenfilter nach Apple, dann Banana, dann Mango und schließlich Orange.
Es enthält keine Daten, sondern nur einen Zeiger darauf.Die Spaltennamen usw. werden aus der eigentlichen Datentabelle abgerufen.
Sie sollten sich die Zeit nehmen, den Skriptleitfaden zu lesen, der in der JMP-Dokumentationsbibliothek im Pulldown-Menü „Hilfe“ verfügbar ist.
Betreff: Variablen werden nicht zwischen Skripten übergebenDanke, das hat es behoben!
Wenn ich also das Heatmap-Skript ausführe, erhalte ich die folgende Meldung. Wenn ich mich verändere
dt= trans:thelist[5]
es funktioniert aber wieder nur für die zuletzt erstellte Datentabelle. Auch dieses Namespace-Konzept ist mir neu. Lassen Sie mich versuchen, zusammenzufassen, was dies tut, und können Sie bestätigen, ob mein Verständnis richtig ist? Durch die Verwendung von Namespace im Skript können wir also alle Datentabellennamen (und vor allem die Spaltennamen und den Wert dieser Datentabelle) in einer Liste trans speichern, die wir dann im Heatmap-Skript aufrufen.

Betreff: Variablen werden nicht zwischen Skripten übergebenMein Fehler, ändern
insert into(theList,dt);
Zu
insert into(trans:theList,dt);
theList existiert nicht...... aber trans:theList existiert
Betreff: Variablen werden nicht zwischen Skripten übergebenDanke für die Eingabe!
Wenn ich das von Ihnen bereitgestellte aktualisierte Extract_cols-Skript ausführe, erhalte ich die folgende Fehlermeldung unten über den L-Wert-Zugriff ...

Betreff: Variablen werden nicht zwischen Skripten übergebenSie spezifizieren
Names Default To Here( 1 );
wodurch ein separater Speichernamensraum für dieses spezifische Skript erstellt wird.Das heißt, in Ihrem Skript extract_cols gibt es eine Liste mit dem Namen "Frucht".Wenn Sie in Ihrem Heatmap-Skript angegeben haben
myFruit = fruit[1];
Ihr Heatmap-Skript würde nichts über Ihre Variable namens Frucht wissen.
In Ihrem Heatmap-Skript setzen Sie die Variable "dt" gleich der aktuellen Datentabelle.Ihrer Beschreibung nach führen Sie das Headmap-Skript direkt nach dem Ausführen des Extract_cols-Skripts aus.In JMP gibt es zu jedem Zeitpunkt nur eine Datentabelle, die die aktuell aktive Datentabelle ist.Daher, wenn Sie angeben
dt = Current Data Table();
Das Heatmap-Skript ruft die aktuell aktive Datentabelle ab, die die letzte Datentabelle wäre, die Sie im Skript extract_cols erstellt haben
Wenn Sie die ursprüngliche Datentabellenreferenz und möglicherweise die anderen 4 Datentabellenreferenzen an das zweite Skript übergeben müssen, besteht eine Möglichkeit darin, einen separaten Namespace zu erstellen und die Referenzen in diesem Namespace zu platzieren.Hier ist eine Änderung an Ihrem Skript, die den Namespace erstellt und die Datentabellenreferenzen darin platziert.
Names Default To Here( 1 );
Clear Symbols();
dt = Current Data Table();
if(isnamespace("trans")==0, trans = new namespace("trans"));
trans:theList = {};
insert into(theList,dt);
fruit = {"Apple","Banana","Mango","Orange"};
For(i = 1, i <= N Items(fruit), i++,
obj = dt << Tabulate(
Set Format( Uniform Format( 10, 0 ) ),
Add Table(
Column Table(
Statistics( Median ),
Grouping Columns( :fruits ),
Analysis Columns( :Values )
),
Row Table( Grouping Columns( :Countries, :locations ) )
),
Local Data Filter(
Add Filter(
columns( :fruits),
Where( :fruits == fruit[i] ),
Display( :fruits, N Items( 14 ) )
)
)
);
trans:theList[i+1] = obj<< make into data table;
Current Report() << Close Window
);
Dann können Sie in Ihrem Heatmap-Skript auf den Namespace verweisen, um die primäre Tabellenreferenz oder eine der Datentabellenreferenzen abzurufen, die im Namespace gespeichert wurden.
Names Default To Here( 1 );
Clear Symbols();
dt = trans:thelist[1];
dt << Begin Data Update;
///////////////////////////////////
// Setting Variables for script ///
//rev_scale = "Reverse Scale";
rev_scale =0;
mean_median = 1; //mean=0, median=1
print(mean_median);
///////////////////////////////////
//gets all columns that are continous and stores that in a list as strings.
colList = dt << get column names( continuous, string );
print(colList);
// Create a temporary subset where the columns are the column list, selects all rows,
// invisible makes it so you don't see the datatable on screen since it is temporary
dtsub = dt << subset(columns(colList), selected rows(0),invisible);
// Move the data into a matrix this will be used later to get min, max, median|mean
allData = dtsub << get as matrix;
// Close the no longer needed temporary data table
close(dtsub, nosave);
// Calculate the statistics across the full data matrix
myMax = Maximum(allData);
myMin = Minimum(allData);
if(mean_median == 0,
myMid = Mean(allData),
myMid = Median(allData)
);
print(myMax);
print(myMin);
print(myMid);
print(colList);
// Run for loop over data table with the min, max and median|mean calculated from above
// gradient color scheme needs to be set.
if(rev_scale == 1,
For( i = 1, i <= N Items( colList ), i++,
Eval(
Substitute(
Expr(
Column( __col__ ) <<
set property(
"color gradient",
{"Green Yellow Red",
Range( {__Max__, __Min__, __Mid__} ),"Reverse Scale"}
) << Color Cell by Value( 1 );
),
Expr( __col__ ), colList[i],
Expr( __Max__ ), myMax,
Expr( __Min__ ), myMin,
Expr( __Mid__ ), myMid
)
);
);
,
For( i = 1, i <= N Items( colList ), i++,
Eval(
Substitute(
Expr(
Column( __col__ ) <<
//Column( colList[i] ) <<
set property(
"color gradient",
{"Green Yellow Red",
Range( {__Max__, __Min__, __Mid__} )}
) << Color Cell by Value( 1 );
),
Expr( __col__ ), colList[i],
Expr( __Max__ ), myMax,
Expr( __Min__ ), myMin,
Expr( __Mid__ ), myMid
)
);
);
);