Name zitiert einen seltsamen SpaltennamenIch versuche, einen Spaltennamen in einen Anpassungsmodellausdruck einzufügen. Dafür muss ich seltsame Zeichen in Spaltennamen maskieren, damit wir die :"name"n-Konvention verwenden. Wie gehe ich also von einem String-Spaltennamen zu diesem Format?
colListY = {"Plating Thickness (m\!"\!")"};
//This doesn't work
newcolumnref = eval insert("\[:"^colListY[1]^"n]\");
//Looking for this end result
:"Plating Thickness (m\!"\!")"nDie ich dann irgendwo einfügen kann, zum Beispiel:
insert into(expr(Y()), newcolumnref);
Kennt jemand einen robusten Weg, dies zu tun?
SkripterstellungBetreff: Name zitiert einen seltsamen SpaltennamencolListY = {"Plating Thickness (m\!"\!")"};
dt = Open( "$sample_data/big class.jmp" );
dt:age << setname( colListY[1] );
Eval(
Eval Expr(
dt << New Column( "test",
Numeric,
"Continuous",
Format( "Fixed Dec", 12, 2 ),
Formula( Column( Expr( colListY[1] ) )[] ),
Set Display Width( 78 )
)
)
);Das leere [ ] weist JMP an, die Spalte für die aktuelle Zeile auszuwerten.
Das Erstellen von Spaltenformeln wie dieser verbirgt wahrscheinlich die zugrunde liegenden Spaltenabhängigkeiten vor dem Formel-Evaluator von JMP; sehen Diskussion . Wenn Sie Formelspalten haben, die von anderen Formelspalten abhängen, kann JMP möglicherweise nicht in diese Indirektion einsehen, um herauszufinden, was zuerst ausgewertet werden soll.
Betreff: Name zitiert einen seltsamen SpaltennamenDas führt bei mir zu einem Spaltenformelfehler
Betreff: Name zitiert einen seltsamen Spaltennamen(ohne es zu versuchen, könnte also falsch sein)
Formula( column(expr(colListY[1])) - :height ),
Ich denke, Sie wollen den expr in der Spalte. Auf diese Weise wird die Spaltenfunktion später anhand der zuvor erfassten Zeichenfolge ausgewertet.
Betreff: Name zitiert einen seltsamen Spaltennamen@XanGregg Spaltenformeln funktionieren auf diese Weise nicht und die speziellen Zitiermethoden funktionieren:
colListY = {"Plating Thickness (m\!"\!")"};
dt = Open( "$sample_data/big class.jmp" );
dt:age << setname( colListY[1] );
eval(eval expr(dt << New Column( "test",
Numeric,
"Continuous",
Format( "Fixed Dec", 12, 2 ),
Formula( expr(column(colListY[1])) - :height ),
Set Display Width( 78 )
)));Es erzeugt eine Funktionsspalte, in der die Formel lautet:
Column( "Plating Thickness (m\!"\!")" ) - /*###*/:height/*###*/
was nicht bewertet.
Das macht:
WrapColumns = Function({ColName},{default local},
ReturnList = {};
If(is list(ColName),
For(i=1, i<=n items(ColName), i++,
insert into(ReturnList, parse(":" || Log Capture( Print( ColName[i] ) ) || "n"))
);
,
insert into(ReturnList, parse(":" || Log Capture( Print( ColName ) ) || "n"))
);
Return(ReturnList);
);
eval(eval expr(dt << New Column( "test2",
Numeric,
"Continuous",
Format( "Fixed Dec", 12, 2 ),
Formula( expr(WrapColumns(colListY)[1]) - :height ),
Set Display Width( 78 )
)));Kennen Sie eine Möglichkeit, dies mit dem System column() zu beheben?
Betreff: Name zitiert einen seltsamen SpaltennamenNach sorgfältigem Testen und Durchgehen einiger meiner Skripte konnte ich es nicht wieder zum Scheitern bringen. Danke für das Kontrollieren!
Betreff: Name zitiert einen seltsamen SpaltennamenDas ist eine großartige Frage!
Betreff: Name zitiert einen seltsamen SpaltennamenDas ist eine großartige Frage!
Betreff: Name zitiert einen seltsamen Spaltennamen@XanGregg Jetzt, wo ich es mit Ihrem Code teste, funktioniert es auch hier. Lassen Sie mich nachforschen und sehen, ob ich das fehlgeschlagene Beispiel vollständiger teilen kann ...
Betreff: Name zitiert einen seltsamen SpaltennamenNur zum Kichern, ich habe den Code auf JMP 11.2.1 zurückgenommen und es funktioniert großartig.
Betreff: Name zitiert einen seltsamen SpaltennamenKönnen Sie den Teil "funktioniert nicht" näher erläutern? Ich habe Versionen zurück zu JMP 15 ausprobiert und das Folgende scheint zu funktionieren. Vielleicht übersehe ich einen Teil des Problems.
Data Table( "Big Class" ):weight << Set Name( "weight\!"\!"" );
Fit Model(
Y( Column( "weight\!"\!"" ) ),
Effects( :age, :sex, :height ),
Personality( "Standard Least Squares" ),
Run()
);
Betreff: Name zitiert einen seltsamen SpaltennamenZur Erklärung für jeden Beobachter: Die Druckfunktion macht zwei Dinge: Sie maskiert die internen Anführungszeichen (und andere Sonderfälle) und fügt externe Anführungszeichen hinzu. Das erzeugt eine gültige Zeichenfolge, und Pauls Code fügt dann ein : vor und ein n danach hinzu und parst das Ergebnis in eine JSL Spaltenname konstant . Es könnte eine tatsächliche Spalte geben, die die Spaltenname konstant kann angehängt werden, wenn es in einem Skript verwendet wird. Die Spalte muss nicht vorhanden sein, wenn Pauls Code ausgeführt wird. Ohne die print()-Funktion bin ich mir nicht sicher, welche Funktion ich verwenden würde, um das Escaping zu erledigen (die Regeln sind zu kompliziert, um meine eigenen zu schreiben). Da der ursprüngliche Name eingebettete Anführungszeichen enthielt, muss es vorher maskiert werden wurde zu einem Spaltenname konstant .
Wenn die Datentabelle geöffnet ist, können Sie die Funktion column() auf die gleiche Weise verwenden, um eine zu erhalten Spaltenobjekt das (da bin ich mir ziemlich sicher) kann an denselben Stellen verwendet werden wie das Spaltenname konstant erscheinen kann. Dass Spaltenobjekt bezieht sich auf eine echte Spalte, zumindest bis die Tabelle geschlossen wird. Starten einer Plattform mit einem abgelaufenen Spaltenobjekt oder ein Spaltenname konstant die mit keiner Tabellenspalte übereinstimmt, wird eine erwartete Fehlermeldung erzeugen.
@XanGregg
Betreff: Name zitiert einen seltsamen SpaltennamenAktualisiert mit Craiges Feedback, danke für die 1/i!
WrapColumns = Function({ColName},{default local},
ReturnList = {};
If(is list(ColName),
For(i=1, i<=n items(ColName), i++,
insert into(ReturnList, parse(":" || Log Capture( Print( ColName[i] ) ) || "n"))
);
,
insert into(ReturnList, parse(":" || Log Capture( Print( ColName ) ) || "n"))
);
Return(ReturnList);
);Betreff: Name zitiert einen seltsamen SpaltennamenEs ist zu kompliziert. Wahrscheinlich können Sie regex() durch trim() ersetzen, denn das ist alles, was es tut. Ursprünglich dachte ich, es würde die äußeren Anführungszeichen entfernen, die print() hinterlässt. (Bearbeiten: und es ist überhaupt nicht nötig, die Eingabe zu kürzen!)
Möglicherweise haben Sie in Ihrem Beispiel [1], wo Sie [i] benötigen.
Betreff: Name zitiert einen seltsamen SpaltennamenDanke Craige, es scheint, als wäre das komplizierter als es sein sollte, aber es funktioniert 
Für alle, die dies versuchen, habe ich Craiges Lösung in eine Funktion eingefügt:
WrapColumns = Function({ColName},{default local},
ReturnList = {};
If(is list(ColName),
For(i=1, i<=n items(ColName), i++,
insert into(ReturnList, parse(":" || Regex( Log Capture( Print( ColName[1] ) ), "^\s*(.*)\s*$", "\1" ) || "n");)
);
,
insert into(ReturnList, parse(":" || Regex( Log Capture( Print( ColName ) ), "^\s*(.*)\s*$", "\1" ) || "n");)
);
Return(ReturnList);
);Betreff: Name zitiert einen seltsamen SpaltennamenWeitere Anmerkungen:
Ich habe explizit auf die Tabelle in der Spaltenfunktion verwiesen. Kann einen Unterschied machen, wenn mehrere Tische geöffnet sind.
Wenn Sie Zeichenfolgen verketten, reicht dies möglicherweise aus. Sie können immer :"height"n verwenden, auch wenn es nicht erforderlich ist (z. B. Höhe).
colreftxt = ":" || Regex( Log Capture( Print( colListY[1] ) ), "^\s*(.*)\s*$", "\1" ) || "n";
write(colreftxt);
:"Überzugsdicke (m\!"\!")"n
</CODE>das könnte rechts entgangen sein. Die Manipulation von Ausdrücken wird wahrscheinlich einfacher sein als das Analysieren von so zusammengesetztem Text.</P><P> </P><P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-415759" slang="en-US">Betreff: Name zitiert einen seltsamen Spaltennamen</LINGO-SUB><LINGO-BODY id="lingo-body-415759" slang="en-US"><P>versuchen Sie diese Kombination der beiden Antworten:</P><PRE><CODE class=" language-jsl">colListY = {"Plating Thickness (m\!"\!")"};
dt = Open( "$sample_data/big class.jmp" );
dt:age << setname( colListY[1] );
script = Expr(
Fit Model(
Y( F1 ),
Effects( :height ),
Personality( "Standard Least Squares" ),
Run( F1 << {Plot Actual by Predicted( 1 ), Plot Residual by Predicted( 1 ), Plot Effect Leverage( 1 )} )
)
);
Substitute Into( script, Expr( F1 ), Column( dt, colListY[1] ) );
Write( Name Expr( script ) );
/*
Fit Model(
Y( Column( "Plating Thickness (m\!"\!")" ) ),
Effects( :height ),
Personality( "Standard Least Squares" ),
Run(
Column( "Plating Thickness (m\!"\!")" ) << {Plot Actual by Predicted( 1 ),
Plot Residual by Predicted( 1 ), Plot Effect Leverage( 1 )}
)
)
*/
Eval( script );
run with column substitutedAusführen mit ersetzter Spalte
Betreff: Name zitiert einen seltsamen Spaltennamen@txnelson Das Problem besteht darin, dass beim Erstellen des Anpassungsmodellskripts das Format column() nicht verwendet werden kann:
Fit Model(
//Y( :"Plating Thickness (m\!"\!")"n ), <- works
Y(column("Plating Thickness (m\!"\!"")), //<- does not work
Effects(
:"Shift-temp"n, :Position, :Subgroup, :"Shift-temp"n * :Position,
:"Shift-temp"n * :Subgroup, :Position * :Subgroup
),
Personality( "Standard Least Squares" )
);@Craige_Hales Der Benutzer wählt die Spalten mit einem Col-Listenfeld () aus, und ich übergebe ihm eine <<-Get-Items-Nachricht. Das gibt mir die Liste der Spaltennamen als String. Ich könnte diese Spaltennamen in der Tabelle finden und die Spaltennummer finden, aber beim Zusammenstellen des Effektausdrucks erlaubt mir diese Methode nicht, die Interaktionen wie oben gezeigt zu erstellen.
Gibt es eine Möglichkeit, eine Ausdrucksverkettung durchzuführen, um mit Namensflucht von einer Zeichenfolge zu einer Col-Referenz zu wechseln?
Betreff: Name zitiert einen seltsamen SpaltennamenWenn Sie vermeiden können, den Namen der Spalte als Zeichenfolge zu erhalten, und stattdessen das Spaltenobjekt erhalten, ist es möglicherweise einfacher. Unten ist cols eine Liste von Spaltenobjekten, nicht ihre Namen.
colListY = {"Plating Thickness (m\!"\!")"};
dt = Open( "$sample_data/big class.jmp" );
dt:age << setname( colListY[1] );
cols = dt << getcolumnnames;// don't use the string keyword
/* {name, "Plating Thickness (m\!"\!")"n, sex, height, weight} */
script = Expr(
Fit Model(
Y( :weight ),
Effects( F1 ),
Personality( "Standard Least Squares" ),
Run(
:weight << {Plot Actual by Predicted( 1 ), Plot Residual by Predicted( 1 ),
Plot Effect Leverage( 1 )}
)
)
);
Substitute Into( script, Expr( F1 ), cols[2] );
Write( Name Expr( script ) );
/*
Fit Model(
Y( :weight ),
Effects( "Plating Thickness (m\!"\!")"n ),
Personality( "Standard Least Squares" ),
Run(
:weight << {Plot Actual by Predicted( 1 ), Plot Residual by Predicted( 1 ),
Plot Effect Leverage( 1 )}
)
);
*/Betreff: Name zitiert einen seltsamen SpaltennamenSie können die Funktionen Column oder As Column verwenden, um den komplexen Spaltennamen zu schützen
colListY = {"Plating Thickness (m\!"\!")"};
newcolumnref = eval insert("column(\!"^colListY[1]^\!")");