SAS vers JSL - Faire des boucles...Je suis un utilisateur SAS de longue date obligé d'apprendre JSL ...
Les choses que j'ai trouvées faciles dans SAS semblent si difficiles dans JSL...
Quelqu'un pourrait-il me montrer comment fonctionnent les boucles Do Loops dans JSL en partageant avec moi le code JSL qui générerait la table do loop imbriquée suivante à l'aide de JSL?
data frustration;
do temp = 1 to 10 by 1;
do press = 5 to 20 by 5;
do time = 1 to 1000 by 20;
output;
end;
end;
end;
run;
Cela devrait être assez simple pour créer ces types de simulations, mais je n'arrive pas à comprendre cela.
ScriptRe: SAS vers JSL - Faire des boucles...Jeff - vraiment désolé d'être en retard. Vous êtes allé au-delà de cette réponse et je vous en remercie. La raison pour laquelle je n'ai pas vérifié est que j'ai pu le faire fonctionner comme je le voulais. Merci beaucoup pour l'explication des différences JSL et SAS. C'était vraiment utile
Re: SAS vers JSL - Faire des boucles...Salut @fat_angus , bienvenue en tant qu'utilisateur JMP et dans la communauté des utilisateurs JMP.
En tant que programmeur SAS de longue date (j'en suis un moi-même), vous devrez penser à JMP et JSL très différemment de la façon dont vous pensez à SAS.
Par exemple, vous avez posté une question sur une étape SAS DATA. Comme vous le savez, l'étape DATA consiste à créer un ensemble de données SAS. Il n'y a pas d'équivalent direct pour l'étape DATA dans JSL puisque JSL consiste principalement à automatiser les choses que vous feriez de manière interactive dans JMP.
C'est pourquoi j'encourage toujours les utilisateurs à s'assurer qu'ils disposent de bonnes bases pour utiliser JMP de manière interactive avant de commencer à réfléchir aux tâches qu'ils souhaitent automatiser.
Par exemple, pour créer la table de données que vous créez dans votre étape DATA, je créerais un fichier-> nouvelle table...
Alors Cols->Nouvelles colonnes... pour ajouter une nouvelle colonne et lui donner une formule en utilisant le Séquence() fonction.

Temp columnTemp columnColonne Temp
Je ferais de même pour les autres colonnes.
press columnpress columncolonne de presse
time columntime columncolonne de temps
Après avoir ajouté des lignes à la table de données, vous vous retrouverez avec ceci :

Lorsque vous êtes prêt, vous pouvez accéder au triangle rouge à côté du nom de la table de données et copier le script de la table.

Cela vous donnera le script suivant pour créer une nouvelle table :
New Table( "untitled",
Add Rows( 2000 ),
New Column( "temp",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( Sequence( 1, 10, 1, 200 ) )
),
New Column( "press",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( Sequence( 5, 20, 5, 50 ) )
),
New Column( "time",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( Sequence( 1, 1000, 20 ) ),
)
)
Il existe, bien sûr, d'autres moyens interactifs d'obtenir le tableau que vous avez décrit dans votre étape DATA. Vous pouvez créer trois tableaux avec vos séquences, puis utiliser Tables->Rejoindre et un couple de Jointures cartésiennes pour obtenir la même table. Lorsque vous êtes prêt, JMP peut vous fournir les scripts pour ces étapes en cours de route.
Quoi qu'il en soit, tout commence par comprendre comment utiliser JMP et en particulier les tables de données de manière interactive avant de penser à le scripter. Après tout, vous ne savez pas ce qui est nécessaire pour créer des scripts tant que vous ne savez pas déjà ce que JMP peut faire avec les outils intégrés.
Continuez à apprendre et continuez à poser des questions ici dans la Communauté. Nous sommes heureux de vous aider !
Re: SAS vers JSL - Faire des boucles...C'est super Craige_HALES !
J'apprécie beaucoup que vous preniez le temps d'expliquer.
Re: SAS vers JSL - Faire des boucles...Merci SUPER USER PMROZ une fois de plus ; c'est utile.
Re: SAS vers JSL - Faire des boucles...Un exemple complet, appréciant à quel point il est difficile de se lancer dans une nouvelle langue. (L'index aide->scripting et l'aide en ligne sont des ressources complémentaires. J'utilise principalement l'index help->scripting, pour me rappeler comment cela fonctionne. L'aide en ligne pourrait être meilleure pour commencer.) J'ai mis un peu plus ici que juste nécessaire. J'ai oublié les règles SAS pour la casse des noms...
Names Default To Here( 1 );
// what does that mean? JSL has several namespaces; the 'here' namespace is for this
// editor window and means 'press' is really 'here:press' but 'dtFrustration:press' belongs to
// the table's namespace (of column names.) You could also just use different names,
// like 'iPress' for the loop control variable. JMP's variable names are almost never
// case sensitive, the weird exception being column names, which are only sensitive <BR />// if both 'Age' and 'age' are columns...Don't do that!
// an easy way to get this table script is to make a new table with the
// JMP GUI, then use the top-left red triangle to 'Copy Table Script (No Data)'.
// By convention, JSL uses 'dt' in the variable name that holds a handle to a table.
dtFrustration = New Table( "frustration",
New Column( "temp" ), // continuous numeric by default
New Column( "press" ),
New Column( "time" )
);
// because the table might be linked to other reports, there
// is a lot of hidden messaging when the table changes. A lot.
// The messaging can be shut off and later enabled for a nice speedup.
// (to see it take longer, rerun just the loop below.)
// dtFrustration << BeginDataUpdate; // pair with EndDataUpdate, below
For( temp = 1, temp <= 10, temp++,
For( press = 5, press <= 20, press += 5,
For( time = 1, time <= 1000, time += 20,
dtFrustration << addrows( 1 );
dtFrustration:time = time;
dtFrustration:temp = temp;
dtFrustration:press = press;
)
)
);
// dtFrustration << EndDataUpdate;
Re: SAS vers JSL - Faire des boucles...Je trouve qu'il est plus facile d'apprendre par l'exemple, alors regardez autant de code que vous pouvez trouver dans ce forum.Une fois que vous aurez commencé, l'index de script sera vraiment votre ami.
La JSL pour boucles et si déclaration, bien que simple dans son concept, m'a un peu déconcerté au début.Pour raccourcir votre courbe d'apprentissage sur si , souvenez-vous qu'il s'agit d'une fonction et que la virgule représente alors , sinon si et autre .Ouvrir une fenêtre de script ( ctrl-T ), faites un clic droit dans la fenêtre et sélectionnez Afficher le journal intégré .Collez le code ci-dessous et cliquez sur ctrl-R pour l'exécuter.Jouez avec différentes valeurs pour a, b et c pour voir ce qui se passe.
a = 1;
b = 2;
c = 1;
if (a == b,
// then
print("a is equal to b");
,
// else if
a == c,
// then
print("a is equal to c");
,
// else
print("No match found for a");
);
Re: SAS vers JSL - Faire des boucles...Merci... c'est utile.
Re: SAS vers JSL - Faire des boucles...J'entends ce que vous dites ... merci ... mais c'est un peu comme si quelqu'un vous disait de lire la Bible pour comprendre le christianisme ... J'ai passé environ 2 heures dans le guide de script à chercher comment faire cela apparemment concept simple... de plus, j'ai eu beaucoup de succès en écrivant d'autres scripts... mais honnêtement, le guide de script me fait aspirer à 20k supplémentaires dans le budget d'une licence SAS.
Je ne suis pas un codeur pur et dur... Je suis un ingénieur qui essaie juste de faire avancer les choses rapidement.
Re: SAS vers JSL - Faire des boucles...Merci pour l'aide pmroz
Re: SAS vers JSL - Faire des boucles...Guide du programmeur C++ pour JSL peut être utile aussi. Il essaie de montrer comment l'instruction JSL for est vraiment une fonction, et savoir que cela rendra beaucoup plus facile d'obtenir la bonne syntaxe.
Re: SAS vers JSL - Faire des boucles...Tout cela est couvert dans le Scripting Guide, que je vous recommande très, très fortement de lire.Il est disponible dans la bibliothèque de documentation JMP, disponible dans le menu déroulant Aide de JMP.
Re: SAS vers JSL - Faire des boucles...Vous êtes au bon endroit pour obtenir de l'aide pour apprendre JSL.L'index de script est votre ami, tout comme la documentation en ligne.
Voici un extrait de code qui fait ce que vous voulez :
dt = data table("frustration");
for (temp = 1, temp <= 10, temp++,
for (press = 5, press <= 20, press+=5,
for (time = 1, time <= 1000, time+=20,
show(temp, press, time); // output
);
);
);