Citations dans l'expression<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
Supposons que je veuille concaténer un grand nombre de tables qui ont toutes le même format. Je voudrais avoir un seul appel pour concaténer la fonction, plutôt qu'une boucle pour concaténer une table de données à la fois. C'est parce que je veux apprendre des expressions dans JMP.
j'aimerais avoir quelque chose comme ça
Table de données ("dt1") << concaténer(table de données ("dt2"), table de données ("dt3"),…, table de données ("dt100"))
Dans cet exemple, je crée des copies des mêmes exemples de données, mais imaginez qu'elles puissent provenir de différentes sources et contenir des valeurs différentes.
ferme tout ( tableaux de données , nosave ) ;
dt1 = Ouvert ( "$SAMPLE_DATA/Grande classe.jmp" ) ;
N = 100 ;
/*dans cette boucle, je copie la table de données et crée une chaîne, dans le but de l'utiliser dans la fonction de concaténation*/
/*J'utilise le caractère d'échappement car j'ai des guillemets doubles*/
dt_string = "" ;
pour ( je = 2 , je <= N , je ++,
dt_tmp = ( dt1 << sous-ensemble ( toutes les rangées , toutes les colonnes , invisible )) ;
dt_name = "dt" || carboniser ( je ) ;
dt_tmp << définir le nom ( dt_name ) ;
si ( dt_string == "" ,
dt_string = "table de données(\!"" || dt_name || "\!")" ;,
dt_string = dt_string || ", table de données(\!"" || dt_name || "\!")" ) ;
) ;
Afficher ( dt_string ) ;
concat_expr = expr ( dt1 << enchaîner ( dt_list )) ;
Afficher ( concat_expr ) ;
concat_expr2 = remplaçant ( Nomexpr ( concat_expr ) , expr ( dt_list ) , dt_string ) ;
Afficher ( concat_expr2 ) ;
eval ( concat_expr2 ) ;
Et mon problème est que j'ai toujours le caractère d'échappement dans l'expression et son évaluation échoue.
Pourriez-vous proposer un code pour construire l'expression correcte ?
Merci d'avance.
JF
Re : Citations dans l'expressionPour être clair, tout le code que j'ai proposé jusqu'à 'Show(tbls)' n'était qu'un moyen rapide de créer une liste de tables que vous pouvez alimenter pour concaténer.
Mais si vous voulez rendre les choses invisibles, vous pouvez faire :
// Ouvre un tableau
dt1 = Ouvert ( "$SAMPLE_DATA/Grande classe.jmp" ) ;
dt1script = dt1 << getScript ;
Imprimer ( dt1script ) ;
Insérer dans ( dt1script , Expr ( Invisible )) ;
Imprimer ( dt1script ) ;
qui, par coïncidence, est un exemple simple de la façon dont vous pouvez manipuler des expressions.
Re : Citations dans l'expressionMerci à vous deux pour les réponses. Je ne savais pas que nous pouvions fournir des listes pour concaténer des fonctions.
La réponse de MS était exactement ce que je cherchais. J'étais très proche.
Ci-dessous, j'organise les deux options afin de comparer l'efficacité de la chaîne par rapport à la liste.
L'option de chaîne prend 2,85 secondes et l'option de liste prend 4,38 secondes.
Nous pouvons accélérer le code en rendant la table de données invisible. Avec la fonction de sous-ensemble, je peux facilement ajouter l'option invisible. Mais avec le getscript, je ne sais pas comment faire.
dt1 = Ouvert ( "$SAMPLE_DATA/Grande classe.jmp" ) ;
N = 100 ;
commencer = Temps HP () ;
dt_string = "" ;
pour ( je = 2 , je <= N , je ++,
dt_tmp = ( dt1 << sous-ensemble ( toutes les rangées , toutes les colonnes )) ;
dt_name = "dt" || carboniser ( je ) ;
dt_tmp << définir le nom ( dt_name ) ;
si ( dt_string == "" ,
dt_string = "table de données(\!"" || dt_name || "\!")" ;,
dt_string = dt_string || ", table de données(\!"" || dt_name || "\!")" ) ;
) ;
Afficher ( dt_string ) ;
concat_expr = expr ( dt1 << enchaîner ( dt_list )) ;
Afficher ( concat_expr ) ;
concat_expr2 = remplaçant ( Nomexpr ( concat_expr ) , expr ( dt_list ) , analyser ( "{" || dt_string || "}" )) ;
Afficher ( concat_expr2 ) ;
eval ( concat_expr2 ) ;
Pour ( je = 2 , je <= N , je ++, proche ( tableau de données ( "dt" || carboniser ( je )) , Pas d'enregistrement )) ;
fin = Temps HP () ;
solution1 = ( fin - commencer ) / 1e6 ; /*pour avoir des secondes plutôt que des microsecondes*/
commencer = Temps HP () ;
dt1script = dt1 << getScript ;
tables = {} ;
Pour ( je = 2 , je <= N , je ++,
Éval ( dt1script ) ;
Insérer dans ( tables , Tableau de données ( "Grande classe" || Carboniser ( je ))) ;
) ;
Spectacle ( tables ) ;
dt1 << Enchaîner ( tables ) ;
Pour ( je = 1 , je <= NIéléments ( tables ) , je ++, proche ( tables [ je ] , Pas d'enregistrement )) ;
fin = Temps HP () ;
solution2 = ( fin - commencer ) / 1e6 ; /*pour avoir des secondes plutôt que des microsecondes*/
Re : Citations dans l'expression(S'il vous plaît, évitez de poster du code comme ferme tout ( tableaux de données , nosave ) ; J'étais négligent et ne pouvais d'abord pas comprendre ce qui était arrivé à toutes mes fenêtres ouvertes)
On dirait que vous obtenez un mélange d'expressions et de chaînes. À un moment donné, la chaîne doit être analysée en code exécutable (de préférence une liste dans ce cas).
Votre code devrait fonctionner correctement si vous modifiez le concat_expr2 affectation dans ceci:
concat_expr2 = remplaçant ( Nomexpr ( concat_expr ) , expr ( dt_list ) , analyser ( "{" || dt_string || "}" )) ;
Cependant, je suggère une approche plus simple : ignorez la chaîne et créez une liste directement.
dt1 = Ouvert ( "$SAMPLE_DATA/Grande classe.jmp" ) ;
N = dix ;
dt_list = {} ;
Pour ( je = 2 , je <= N , je ++,
dt_tmp = dt1 << sous-ensemble ( toutes les rangées , toutes les colonnes , invisible ) ;
Insérer dans ( dt_list , dt_tmp ) ;
) ;
dt1 << enchaîner ( dt_list ) ;
Re : Citations dans l'expressionAprès l'avoir lu deux fois, je pense que votre problème de "concaténer" n'est qu'un exemple pour vous permettre d'approfondir l'utilisation des expressions.
Si ce n'est pas le cas, sachez que '<< Concatenate()' prendra une liste de tables, vous n'aurez donc pas à vous en soucier si vous voulez simplement faire le travail :
NomsDefaultToHere ( 1 ) ;
// Ouvre un tableau
dt1 = Ouvert ( "$SAMPLE_DATA/Grande classe.jmp" ) ;
dt1script = dt1 << getScript ;
// Faire des copies
n = 4 ;
tables = {} ;
Pour ( je = 1 , je <= n , je ++,
Éval ( dt1script ) ;
Insérer dans ( tables , Tableau de données ( "Grande classe" || Carboniser ( je + 1 ))) ;
) ;
Spectacle ( tables ) ;
// Concaténer les copies à la première table - Vous pouvez utiliser la liste des tables, tbls
dt1 << Enchaîner ( tables , AppendToFirstTable ) ;
// Ferme tout sauf la première table
Pour ( je = 1 , je <= NIéléments ( tables ) , je ++, proche ( tables [ je ] , Pas d'enregistrement )) ; .