Créer une formule pour une variable temporaireSalut tout le monde,
Je suis encore nouveau dans les scripts JMP. J'ai besoin d'aide pour créer une formule pour faire de la valeur une variable mais avec son propre nom. Ce que je veux dire est comme ci-dessous. Donc, je veux créer une formule qui peut faire de la colonne 4 ci-dessous une variable pour le graphique de distribution.
c'est comme Plastique = 0,424542
le problème en ce moment est que le nom de la formule sera dans le même qui est t4 = :TYPE;:MIN;. Donc, si je veux tracer la valeur min pour le plastique dans le graphique de distribution, il prendra la valeur min pour la roche car la formule pour la roche est également t4.
alors, comment je peux faire la formule pour que la valeur de la variable devienne
Plastique = :TYPE;:MIN;
Papier = :TYPE;:MIN;
et ainsi de suite, alors il peut déjà s'agir d'une variable indépendante. vraiment apprécié si quelqu'un peut aider à ce sujet. J'ai regardé sur Internet pendant quelques heures déjà.

Re : Créer une formule pour une variable temporaireC'était mon erreur, j'ai omis un ")".Essayez ce code
Names Default To Here( 1 );
dt = Current Data Table();
// Only one set of Spec Limits per column can be set,
// therefore split the data into separate columns
// and set the separate limits for each column
dtSplit = dt << Split( Split By( :TYPE ), Split( :NUMERIC_RESULT ), Sort by Column Property );
// Get the names of the generated columns
colList = dtSplit << get column names( string );
// Loop across the columns and create the spec limits for each column
For( i = 1, i <= N Items( colList ), i++,
Eval(
Substitute(
Expr(
__col__ << set property(
"spec limits ",
{LSL( __LSL__ ), USL( __USL__ ), show limits( 1 )}
)
),
Expr( __col__ ), Parse( "dtSplit:" || colList[i] ),
Expr( __LSL__ ),
Eval(
Parse(
"col mean(dtSplit:" || colList[i] || ")-6*col std dev(dtSplit:" || colList[i
] || ")"
)
),
Expr( __USL__ ),
Eval(
Parse(
"col mean(dtSplit:" || colList[i] || ")+6*col std dev(dtSplit:" || colList[i
] || ")"
)
)
)
)
);
// Create a literal string that contains the JSL required to
// generate the Distributions
theExpr = "Distribution(
Arrange in Rows( 1 ),";
theExpr = theExpr || Char(
Substitute(
Expr(
Continuous Distribution(
Column( __col__ ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Normal Quantile Plot( 1 )
)
),
Expr( __col__ ), Parse( "dtSplit:" || colList[1] )
)
);
For( i = 2, i <= N Items( colList ), i++,
theExpr = theExpr || "," || Char(
Substitute(
Expr(
Continuous Distribution(
Column( __col__ ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Normal Quantile Plot( 1 )
)
),
Expr( __col__ ), Parse( "dtSplit:" || colList[i] )
)
);
);
theExpr = theExpr || ");";
// Run the generated code
Eval( Parse( theExpr ) );Re : Créer une formule pour une variable temporaireSalut Jim,
ici, j'ai joint le tableau pour exécuter le code que vous avez donné avec juste quelques modifications. Si vous exécutez le script que vous avez écrit ici, le graphique de distribution ne sera pas généré automatiquement.
J'ai vérifié le journal et essayé de déboguer ce qui ne va pas, mais il semble que je ne trouve pas pourquoi il se plaint qu'il y a une erreur. ça à l'air bien pour moi.
l'erreur est comme ci-dessous:
Fin inattendue de l'entrée. Il manque peut-être un "," ou ")".
Essayer d'analyser les arguments de la fonction "Distribution".
Ligne 2 Colonne 560 : ...Tracé des quantiles normaux(1));►...
Re : Créer une formule pour une variable temporaireLe code que j'ai fourni devrait également générer les distributions.
Pouvez-vous s'il vous plaît joindre une copie de la table de données sur laquelle vous travaillez, afin que je puisse voir quel est le problème?... Si vous regardez dans le fichier journal, vous devriez également voir quel est le problème.
Re : Créer une formule pour une variable temporaireSalut Jim,
Oui, cela fonctionne pour autant de valeurs TYPE dans la colonne, mais quand vient le temps de tracer le graphique de distribution, je dois toujours le tracer manuellement.
Est-il possible de lui faire tracer automatiquement le graphique de distribution après avoir calculé toutes les limites pour toutes les valeurs TYPE ? J'ai essayé de tracer manuellement le graphique pour exporter le script, mais il semble que tout soit codé en dur sur la valeur TYPE dans le tableau d'exemple que j'ai donné ici uniquement.
La valeur TYPE sera également différente de temps en temps. Donc, je dois éviter la ligne codée en dur dans le JSL.
@txnelson
Re : Créer une formule pour une variable temporaireLe code que j'ai écrit devrait fonctionner avec autant de valeurs TYPE qu'il en trouve dans la table de données.Si ce n'est pas le cas, c'est une erreur et le code doit être corrigé.
Re : Créer une formule pour une variable temporaireLe code que j'ai fourni devrait fonctionner pour autant de valeurs TYPE qu'il trouve dans la table de données.
Re : Créer une formule pour une variable temporaireSalut Jim,
ce que je veux dire, c'est qu'après avoir calculé toutes les limites, il tracera directement le graphique de distribution pour toutes les valeurs TYPE avec la limite calculée. Donc, je pense y parvenir en utilisant le script, mais lorsque j'essaie d'exporter le script après avoir tracé tout le graphique de distribution de TYPE, il semble que tout le graphique de type soit codé en dur dans la table actuelle uniquement.
Cela signifie que si j'ai un nouvel élément pour la colonne TYPE, il ne tracera pas le graphique de distribution. Il ne tracera que ces 4 éléments dans la colonne de type uniquement.
J'espère que cela répond à votre question. faites-le moi savoir si vous avez besoin de plus de précisions à ce sujet. merci!Re : Créer une formule pour une variable temporaire@mhalwi
Pourriez-vous s'il vous plaît expliquer ce que vous entendez par " tracer automatiquement le graphique de distribution " ?Souhaitez-vous que JMP exécute le tracé lorsque vous ouvrez une nouvelle table de données ?Ou souhaitez-vous que JMP reconnaisse la disponibilité de nouvelles données sur un système ?
Re : Créer une formule pour une variable temporaireSalut Jim,
merci beaucoup! ta méthode fonctionne aussi très bien. Une chance de tracer automatiquement le graphique de distribution à l'aide de JSL plutôt que de choisir manuellement de tracer le graphique ?Re : Créer une formule pour une variable temporaireSalut @julien ,
les deux solutions fonctionnent très bien !! Merci à toi!
1 question concernant la méthode alt, je dois tracer manuellement le graphique une fois le tableau divisé. Existe-t-il une méthode pour tracer le graphique de distribution pour toutes les colonnes car la valeur de la colonne TYPE changera toujours ?
Merci encore pour votre aide!!
Re : Créer une formule pour une variable temporaireVoici une approche différente de la sortie que vous tentez de générer ...... elle tire parti du fait que JMP a la capacité d'avoir des limites de spécification comme propriétés de colonne, et pour que la plate-forme de distribution les reconnaisse et les utilise dans le plateforme
Names Default To Here( 1 );
dt = Current Data Table();
// Only one set of Spec Limits per column can be set,
// therefore split the data into separate columns
// and set the separate limits for each column
dtSplit = dt << Split( Split By( :TYPE ), Split( :NUMERIC_RESULT ), Sort by Column Property );
// Get the names of the generated columns
colList = dtSplit << get column names( string );
// Loop across the columns and create the spec limits for each column
For( i = 1, i <= N Items( colList ), i++,
Eval(
Substitute(
Expr(
__col__ << set property(
"spec limits ",
{LSL( __LSL__ ), USL( __USL__ ), show limits( 1 )}
)
),
Expr( __col__ ), Parse( "dtSplit:" || colList[i] ),
Expr( __LSL__ ),
Eval(
Parse(
"col mean(dtSplit:" || colList[i] || ")-6*col std dev(dtSplit:" || colList[i
] || ")"
)
),
Expr( __USL__ ),
Eval(
Parse(
"col mean(dtSplit:" || colList[i] || ")+6*col std dev(dtSplit:" || colList[i
] || ")"
)
)
)
)
);
// Create a literal string that contains the JSL required to
// generate the Distributions
theExpr = "Distribution(
Arrange in Rows( 1 ),";
theExpr = theExpr || Char(
Substitute(
Expr(
Continuous Distribution(
Column( __col__ ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Normal Quantile Plot( 1 )
)
),
Expr( __col__ ), Parse( "dtSplit:" || colList[1] )
)
);
For( i = 2, i <= N Items( colList ), i++,
theExpr = theExpr || "," || Char(
Substitute(
Expr(
Continuous Distribution(
Column( __col__ ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Normal Quantile Plot( 1 )
)
),
Expr( __col__ ), Parse( "dtSplit:" || colList[i] )
)
);
);
theExpr = theExpr || ";";
// Run the generated code
Eval( Parse( theExpr ) );Re : Créer une formule pour une variable temporaireSalut @mhalwi ,
Je vois exactement ce que vous essayez de faire maintenant. Si vous insérez le jsl suivant après avoir construit votre tableau récapitulatif, vous aurez des variables pour la LSL et l'USL nommées pour chaque niveau de Type (script complet joint ici, LSL USL - Original method.jsl) :
For Each Row(Eval(Parse(Concat("LSL_",:Type," = ",Char(lower_limit)))));
For Each Row(Eval(Parse(Concat("USL_",:Type," = ",Char(upper_limit)))));
Désormais, lorsque vous appelez Distribution pour chacun des types et créez vos lignes de référence, ajoutez le nom du type à LSL et USL. Par exemple, dans Dispatch pour "Papier":
Dispatch(
{
"Distributions TYPE=Paper",
"NUMERIC_RESULT"},
"1",
ScaleBox,
{Min(-0.6 ), Max( 1.2 ), Inc( 0.001 ), Minor Ticks( 0 ),
Add Ref Line( USL_Paper, Solid, "Medium Dark Red", "", 2 ),
Add Ref Line( LSL_Paper, Solid, "Medium Dark Red", "", 2 )}
)
Cela m'a fait réfléchir, cependant.Seriez-vous ouvert à une manière légèrement différente d'y parvenir ? Une autre façon de procéder est que si vous divisez votre table d'origine, nous pouvons définir la LSL et l'USL comme propriétés de colonne via jsl. Ensuite, lorsque vous appelez Distribution(), les limites peuvent être tracées automatiquement. JSL pour cela est également attaché (LSL USL - Alt method.jsl).
Est ce que ça aide?
@julien
Re : Créer une formule pour une variable temporaireSalut tout le monde,
Salut @uday_guntupalli et @julien ,
ici, j'ai joint l'exemple de table et le script jmp afin que vous puissiez essayer et avoir une idée de ce que j'essaie de réaliser ici. Modifiez simplement le chemin d'accès au tableau de données de votre ordinateur.
Comme vous pouvez le voir dans le script, il y a une formule (USL et LSL) dans le résumé de la table de données.
Donc, ce que je dois faire maintenant, c'est créer une autre formule qui peut prendre la valeur de USL pour le plastique et ainsi de suite et l'assigner pour qu'elle devienne quelque chose comme Plastic_USL = 0,4. Ensuite, je peux utiliser la variable (Plastic_USL) pour tracer dans le graphique de distribution plastique à l'aide de la fonction sendToReport. ainsi, il en va de même pour l'autre liste d'éléments dans la colonne TYPE.
Je ne peux pas utiliser directement la variable USL car si je l'utilise, elle ne prendra que la dernière valeur USL calculée qui est ROCK et la tracera dans tous les graphiques (Plastique, Coton, Papier, Roche). Ensuite, la ligne pour USL sera correcte pour seulement 1 graphique et fausse pour le reste.
J'ai cherché un moyen de le faire, mais je ne peux aller nulle part et j'ai vraiment besoin de l'aide de vous ici. Votre aide est vraiment appréciée ici !
dt = Open ("C:\*\data_table.csv");
Distribution(
Stack( 1 ),
Continuous Distribution(
Column( :NUMERIC_RESULT ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Count Axis( 1 ),
Normal Quantile Plot( 1 )
),
By( :TYPE );
);
Summary(
Group(:TYPE ),
Mean( :NUMERIC_RESULT ),
Std Dev( :NUMERIC_RESULT )
);
New Column( "lower_limit",
Numeric,
Continuous,
Format( "Best", 8 ),
Formula(
LSL = :Name( "Mean(NUMERIC_RESULT)" ) - 6 *:Name( "Std Dev(NUMERIC_RESULT)" )
),
);
New Column( "upper_limit",
Numeric,
Continuous,
Format( "Best", 8 ),
Formula(
USL = :Name( "Mean(NUMERIC_RESULT)" ) + 6 *:Name( "Std Dev(NUMERIC_RESULT)" )
),
);
wait (1);
dr = Fit Group (
Distribution(
Stack( 1 ),
Continuous Distribution(
Column( :NUMERIC_RESULT ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Count Axis( 1 ),
Normal Quantile Plot( 1 )
),
By( :TYPE )
);
SendToReport(Dispatch({"Distributions TYPE=Cotton","NUMERIC_RESULT"},"1",ScaleBox,
{Min( LSL - 1 ), Max( USL + 1 ), Inc( 0.005 ), Minor Ticks( 1 ),
Add Ref Line( LSL, Solid, "Medium Dark Red", "", 2 ),
Add Ref Line( USL, Solid, "Medium Dark Red", "", 2 )}
)
);
SendToReport(
Dispatch(
{
"Distributions TYPE=Paper",
"NUMERIC_RESULT"},
"1",
ScaleBox,
{Min(-0.6 ), Max( 1.2 ), Inc( 0.001 ), Minor Ticks( 0 ),
Add Ref Line( USL, Solid, "Medium Dark Red", "", 2 ),
Add Ref Line( LSL, Solid, "Medium Dark Red", "", 2 )}
)
);
SendToReport(
Dispatch(
{
"Distributions TYPE=Plastic",
"NUMERIC_RESULT"},
"1",
ScaleBox,
{Min( 0.1 ), Max( 0.4 ), Inc( 0.005 ), Minor Ticks( 0 ),
Add Ref Line( USL, Solid, "Medium Dark Red", "", 2 ),
Add Ref Line( LSL, Solid, "Medium Dark Red", "", 2 )}
)
);
SendToReport(
Dispatch(
{
"Distributions TYPE=Rock",
"NUMERIC_RESULT"},
"1",
ScaleBox,
{Min( 0.01 ), Max( 3.5 ), Inc( 0.01 ), Minor Ticks( 0 ),
Add Ref Line( USL, Solid, "Medium Dark Red", "", 2 ),
Add Ref Line( LSL, Solid, "Medium Dark Red", "", 2 )}
)
);
)<<REPORT></REPORT>
Re : Créer une formule pour une variable temporaireSalut @mhalwi ,
Je ne sais pas exactement ce que vous demandez, mais j'ai deux suppositions, alors j'espère que l'une est la bonne !
Première supposition : essayez-vous de construire une formule qui renverra une colonne avec le texte de type, puis un signe égal, puis la valeur dans la colonne min ? La formule suivante dans une colonne de formules accomplira cela :
Concat(:Type," = ",Char(:Min))
et renvoie une table comme celle-ci :
J'ai joint le tableau d'exemple au cas où cela aiderait.
Deuxième supposition : vous souhaitez définir de nouvelles variables, nommées pour les cellules de la colonne type, sur les valeurs de la colonne min. Ou dit différemment, vous voulez évaluer le texte dans la colonne 4 du tableau ci-dessus. Si c'est ce que vous recherchez (et que vous avez créé ce tableau), vous pouvez exécuter le jsl suivant :
For Each Row(Eval(Parse(:Column 4)));
Mais, faire cette colonne juste pour l'évaluer n'est probablement pas l'approche la plus parcimonieuse. Si c'est ce que vous essayez de faire, ce qui suit définira ces variables sans créer cette colonne de formule :
For Each Row(Eval(Parse(Concat(:Type," = ",Char(:Min)))))
J'espère que l'une de ces deux réponses vous aidera!
@julien
Re : Créer une formule pour une variable temporaire@mhalwi ,
Je ne suis pas sûr de comprendre ce que vous essayez de faire. Cependant, je vais essayer d'expliquer en fonction de ce que j'ai compris.
Vous trouverez ci-dessous mon interprétation de ce que vous essayez de faire. Tracez essentiellement une distribution de vos données pour pouvoir voir le minimum de votre type. Je suppose que le graphique ci-dessous permet d'atteindre cet objectif.
Si ce n'est pas ce que vous recherchez, auriez-vous la gentillesse de fournir des captures d'écran de ce que vous essayez de faire - fait dans Excel - afin que la communauté puisse vous aider à atteindre ce que vous essayez de réaliser ?
