Puis-je utiliser une chaîne concaténée comme argument d’une fonction ?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Considérez cet exemple simple :
dt2 = table de données actuelle ();
b = 140 ;
avant JC = char(b);
imprimer(b);
imprimer(avant JC);
dt2 << Nouvelle colonne("plage"||bc||"v1",
Numérique,
Formule (b)
);
// dt2 = table de données actuelle ();
dt2 << Nouvelle colonne("Plage",
Numérique,
Formule(Maximum(:Nom("AA"||bc), :Nom("BB"||bc), :Nom("CC"||bc)) - Minimum(:Nom("AA"||bc) , :Nom("BB"||bc), :Nom("CC"||bc)))
);
Voici le tableau :

Message d'erreur renvoyé :

Je fais très peu de programmation JSL, alors aidez-moi s'il vous plaît !!J'adorerais que cela fonctionne.
Re : Puis-je utiliser une chaîne concaténée comme argument d'une fonction ?Oups, je suis désolé pour ça ! Codage JSL de fin de soirée Il semble que Craige ait détecté l'erreur de parenthèse à l'origine de ce problème et ait également simplifié les choses (merci Craig !).
julien
Re : Puis-je utiliser une chaîne concaténée comme argument d'une fonction ?Salut Craige,
Je vais essayer ça.Je pense que la raison pour laquelle je me suis retrouvé avec Name() dans le script est que je l'ai copié directement depuis l'éditeur de formule pour une formule différente.Et maintenant, je pense que je vois le problème avec les parenthèses.
merci!
Re : Puis-je utiliser une chaîne concaténée comme argument d'une fonction ?Salut Julien,
J'ai essayé votre script et il semble fonctionner partiellement.Quand je l'ai exécuté, j'ai eu ceci :

la valeur sous la colonne Plage doit être 5 et non 15.
et le journal dit ceci (ce que je ne comprends pas) :

Il semble que le maximum soit évalué correctement, puis cela s'arrête là.Des idées?Merci pour votre aide
scénario:
dt2 = table de données actuelle ();
b = 140 ;
avant JC = char(b);
imprimer(b);
imprimer(avant JC);
dt2 << Nouvelle colonne("bias"||bc||"v1",
Numérique,
Formule (b)
);
// dt2 = table de données actuelle ();
dt2 << Nouvelle colonne("Plage",
Numérique,
);
eval(analyser(EvalInsert(
"\[
:Plage << Définir la formule( Maximum(:Name("^"AA_"||bc^"), :Name("^"BB_"||bc^"), :Name("^"CC_"||bc )^") -
Minimum(:Nom("^"AA_"||bc^"), :Name("^"BB_"||bc^"), :Name("^"CC_"||bc^"))
)
]\")));
Re : Puis-je utiliser une chaîne concaténée comme argument d'une fonction ?Un peu plus d'informations pour faire suite à la réponse de Julian.
Oui, vous pouvez utiliser la concaténation pour créer un argument pour la plupart des fonctions.Le nom est l’une des exceptions vraiment étranges ; Name() est une aide au moment de l'analyse, pas une fonction d'exécution.
La plupart des noms de variables JSL sont bien formés, une séquence de lettres, de chiffres, de traits de soulignement et d'espaces facilement compréhensibles par l'analyseur JMP.Vos noms, AA_140 , etc., sont bien formés.Parfois, les noms de variables s’avèrent compliqués.Cela se produit généralement avec des virgules ou des signes moins : radiographie ou pommes, poires .Vous ne pouvez pas écrire une expression JSL avec ces noms de variables sans la citer, d'une manière ou d'une autre. C’est exactement ce que fait le wrapper Name() :
nom("X-ray") + nom("pommes, poires")
ajoutera les deux variables ensemble.Le nom est traité (non exécuté) lorsque le code source JSL est analysé, et non lorsqu'il est exécuté.L'argument de Name doit être une simple chaîne au moment de l'analyse.Le code de Julian utilise les fonctions de caractères de JMP pour pré-construire la chaîne concaténée et l'envoyer à la fonction d'analyse.
Parce que les noms de variables sont bien formés (c'est toujours une bonne idée), le wrapper de nom n'est pas nécessaire et l'idée de Julian peut être encore plus simplifiée.(Cela corrige également une parenthèse mal placée.)
eval(analyser(EvalInsert(
"\[
:Plage << Définir la formule (
Maximum(^":AA_" || bc^, ^":BB_" || bc^, ^":CC_" || bc^) -
Minimum(^":AA_" || bc^, ^":BB_" || bc^, ^":CC_" || bc^) )
]\")));

Il existe d'autres fonctions JSL permettant de manipuler des formules directement, sans créer ni analyser de chaînes de caractères, mais l'idée EvalInsert de Julian vous permet d'utiliser la manipulation conviviale de caractères dans JSL.
Re : Puis-je utiliser une chaîne concaténée comme argument d'une fonction ?Salut shehzaad.kaka ,
J'ai pu faire fonctionner cela en créant une expression avec eval, parse et eval insert. Puisque vous avez dit que vous êtes nouveau sur JSL, j'imagine que cela aura l'air assez énigmatique, alors laissez-moi passer en revue deux éléments importants.
La première chose que j'ai faite a été de déplacer la formule sur sa propre partie, distincte de la création de la colonne. C'est ainsi que nous pouvons nous concentrer sur la création d'une expression pour simplement définir la formule de la colonne. L'essentiel de cela est ce que Eval(Parse(EvalInsert( ))); fait.EvalInsert est un outil intéressant pour prendre une chaîne et la remplacer par des variables ou des fonctions de variables. La façon d'indiquer que vous souhaitez une substitution consiste à enrouler ^ ^ autour de la fonction ou de la variable. Par exemple:
g = "Monde" ;
h = EvalInsert("Bonjour ^g^ ");
Légende(h);
h dans ce cas serait égal à "hello world", ce qui sera affiché dans une zone de légende avec le code ci-dessus.
Dans votre situation, j'ai utilisé evalInsert pour les noms de colonnes :
:Nom("^"AA_"||bc^")
Si nous démontons cela, ce sera plus clair
:Nom(" ^ "AA_" || bc ^ ")
La fonction :Name() nécessite du texte entre guillemets, il y a donc des guillemets au début et à la fin des parenthèses. Ensuite, nous avons le ^ ^ enroulé autour de votre concaténation. Evalinsert traite cela et la fonction :Name() se retrouve avec une chaîne entre guillemets AA_140. EvalInsert remplacera partout où quelque chose est enveloppé ^ ^. Il existe une complication particulière : l'expression que nous construisons doit contenir des guillemets, mais nous devons utiliser des guillemets pour désigner la chaîne elle-même. Pour gérer cela, nous pouvons indiquer à JMP que chaque guillemet est en fait censé être un guillemet (plutôt qu'une partie de la syntaxe JMP) en faisant précéder chaque guillemet de \! (slash-bang) ou faites comme je l'ai fait ci-dessous et mettez \[ après le guillemet de départ et ]\ avant le guillemet final. Cela "échappe" à toutes les guillemets dans l'expression que nous construisons.
Ensuite, Parse() convertit la chaîne de caractères en expression JSL, et enfin Eval() exécute l'expression JSL, attribuant la formule à la colonne.
J'espère que ça aide!
julien
ps : votre code n'avait pas les traits de soulignement pour les noms de colonnes, je les ai donc ajoutés.
dt2 = tableau de données actuel () ;
b = 140 ;
avant JC = carboniser ( b ) ;
imprimer ( b ) ;
imprimer ( avant JC ) ;
dt2 << Nouvelle colonne ( "gamme" || avant JC || "v1" ,
Numérique ,
Formule ( b )
) ;
// dt2 = table de données actuelle ();
dt2 << Nouvelle colonne ( "Gamme" ,
Numérique ,
) ;
évaluer ( analyser ( EvalInsérer (
"\[
:Plage << Définir la formule( Maximum(:Name("^"AA_"||bc^"), :Name("^"BB_"||bc^"), :Name("^"CC_"||bc )^") - Minimum(:Nom("^"AA_"||bc^"), :Nom("^"BB_"||bc^"), :Name("^"CC_"||bc^" ))
)
]\" ))) ;