Le nom cite un nom de colonne étrangeJ'essaie d'insérer un nom de colonne dans une expression de modèle d'ajustement. Pour cela, j'ai besoin d'échapper les caractères étranges dans les noms de colonne pour ce faire, nous utilisons la convention :"name"n. Alors, comment puis-je passer d'un nom de colonne de chaîne à ce format ?
colListY = {"Plating Thickness (m\!"\!")"};
//This doesn't work
newcolumnref = eval insert("\[:"^colListY[1]^"n]\");
//Looking for this end result
:"Plating Thickness (m\!"\!")"nQue je peux ensuite insérer n'importe où, par exemple :
insert into(expr(Y()), newcolumnref);
Quelqu'un connaît-il un moyen robuste de le faire?
ScriptRe : Citez un nom de colonne étrangecolListY = {"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 )
)
)
);Le [ ] vide indique à JMP d'évaluer la colonne pour la ligne actuelle.
La création de formules de colonne comme celle-ci masque probablement les dépendances de colonne sous-jacentes de l'évaluateur de formule de JMP ; voir discussion . Si vous avez des colonnes de formules dépendant d'autres colonnes de formules, JMP peut ne pas être en mesure d'examiner cette indirection pour déterminer ce qu'il faut évaluer en premier.
Re : Citez un nom de colonne étrangeCela se traduit par une erreur de formule de colonne pour moi
Re : Citez un nom de colonne étrange(sans l'essayer, donc peut-être tort)
Formula( column(expr(colListY[1])) - :height ),
Je pense que vous voulez l'expr à l'intérieur de la colonne. De cette façon, la fonction de colonne est évaluée ultérieurement, en utilisant la chaîne capturée précédemment.
Re : Citez un nom de colonne étrange@XanGregg Les formules de colonne ne fonctionnent pas de cette façon et les méthodes de guillemets spéciales fonctionnent :
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 )
)));Il produit une colonne de fonction dans laquelle la formule est :
Column( "Plating Thickness (m\!"\!")" ) - /*###*/:height/*###*/
qui ne s'évalue pas.
Cela fait :
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 )
)));Connaissez-vous un moyen de résoudre ce problème avec le système column() ?
Re : Citez un nom de colonne étrangeAprès avoir soigneusement testé et revu quelques-uns de mes scripts, je n'ai pas été en mesure de le faire échouer à nouveau. Merci d'avoir vérifié !
Re : Citez un nom de colonne étrangeC'est une excellente question!
Re : Citez un nom de colonne étrangeC'est une excellente question!
Re : Citez un nom de colonne étrange@XanGregg Maintenant que je le teste avec votre code, cela fonctionne également ici. Permettez-moi d'enquêter et de voir si je peux partager l'exemple défaillant plus complètement...
Re : Citez un nom de colonne étrangeJuste pour rire, j'ai ramené le code à JMP 11.2.1 et cela fonctionne très bien.
Re : Citez un nom de colonne étrangePouvez-vous préciser la partie "ne fonctionne pas" ? J'ai essayé les versions de JMP 15 et ce qui suit semble fonctionner. Peut-être qu'il me manque une partie du problème.
Data Table( "Big Class" ):weight << Set Name( "weight\!"\!"" );
Fit Model(
Y( Column( "weight\!"\!"" ) ),
Effects( :age, :sex, :height ),
Personality( "Standard Least Squares" ),
Run()
);
Re : Citez un nom de colonne étrangePour expliquer à tous ceux qui regardent : la fonction d'impression fait deux choses : elle échappe aux guillemets internes (et autres cas particuliers) et elle ajoute des guillemets externes. Cela produit une chaîne valide, et le code de Paul ajoute ensuite un : devant et un n après et analyse le résultat dans un JSL constante de nom de colonne . Il peut y avoir ou non une colonne réelle que le constante de nom de colonne peut s'attacher lorsqu'il est utilisé dans un script. La colonne n'a pas besoin d'exister lorsque le code de Paul s'exécute. Sans la fonction print(), je ne suis pas sûr de la fonction que j'utiliserais pour effectuer l'échappement (les règles sont trop compliquées pour écrire les miennes). Parce que le nom d'origine contenait des guillemets intégrés, il a besoin de l'échappement avant d'être transformé en un constante de nom de colonne .
Si la table de données est ouverte, vous pouvez utiliser la fonction column() de la même manière pour obtenir un objet colonne qui (je suis presque sûr) peut être utilisé dans tous les mêmes endroits que le constante de nom de colonne peut apparaître. Ce objet colonne fait référence à une colonne réelle, au moins jusqu'à ce que la table soit fermée. Lancer une plateforme avec un expiré objet colonne ou un constante de nom de colonne qui ne correspond pas à une colonne de table produira un message d'erreur attendu.
@XanGregg
Re : Citez un nom de colonne étrangeMis à jour avec les commentaires de Craige, merci pour le 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);
);Re : Citez un nom de colonne étrangeCe est trop compliqué. Vous pouvez probablement remplacer regex() par trim() car c'est tout ce qu'il fait. À l'origine, je pensais qu'il allait supprimer les guillemets externes laissés par print(). (edit : et il n'est pas nécessaire de couper du tout pour que l'entrée soit analysée !)
Vous pourriez avoir [1] là où vous avez besoin de [i] dans votre exemple.
Re : Citez un nom de colonne étrangeMerci Craige, Il semble que ce soit plus compliqué que ça ne devrait l'être mais ça marche 
Pour quiconque essaie de faire cela, je mets la solution de Craige dans une fonction :
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);
);Re : Citez un nom de colonne étrangePlus de remarques :
J'ai explicitement référencé la table dans la fonction de colonne. Peut faire une différence si plusieurs tables sont ouvertes.
Si vous concaténez des chaînes, cela pourrait le faire ; vous pouvez toujours utiliser le :"hauteur"n même s'il n'est pas nécessaire (hauteur, par exemple.)
colreftxt = ":" || Regex( Log Capture( Print( colListY[1] ) ), "^\s*(.*)\s*$", "\1" ) || "n";
write(colreftxt);
:"Épaisseur du placage (m\!"\!")"n
</CODE>qui pourrait être échappé à droite. La manipulation d'expressions sera probablement plus facile que l'analyse de texte assemblé de cette manière.</P><P> </P><P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-415759" slang="en-US">Re : Citez un nom de colonne étrange</LINGO-SUB><LINGO-BODY id="lingo-body-415759" slang="en-US"><P>essayez cette combinaison des deux réponses:</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 substitutedexécuter avec la colonne substituée
Re : Citez un nom de colonne étrange@txnelson Le problème est que lors de la construction du script de modèle d'ajustement, le format column() ne peut pas être utilisé :
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 les utilisateurs sélectionnent les colonnes avec une boîte de liste Col() et je lui passe un message << get items . Cela me donne la liste des noms de colonnes sous forme de chaîne. Je pourrais localiser ces noms de colonnes dans le tableau et trouver le numéro de colonne, mais lors de l'assemblage de l'expression des effets, cette méthode ne me permettra pas de créer les interactions comme indiqué ci-dessus.
Existe-t-il un moyen de concaténation d'expressions pour passer d'une chaîne à une référence col avec un échappement de nom?
Re : Citez un nom de colonne étrangeSi vous pouvez éviter d'obtenir le nom de la colonne sous forme de chaîne et obtenir l'objet colonne à la place, cela pourrait être plus facile. Ci-dessous, cols est une liste d'objets de colonne, pas leurs noms.
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 )}
)
);
*/Re : Citez un nom de colonne étrangeVous pouvez utiliser les fonctions Column ou As Column pour protéger le nom de colonne complexe
colListY = {"Plating Thickness (m\!"\!")"};
newcolumnref = eval insert("column(\!"^colListY[1]^\!")");