Comment est-il possible d'automatiser la sortie des plateformes nécessitant la saisie d'une boîte de dialogue modale ?
Ci-dessous, deux exemples. Le premier fonctionne lors de la spécification de toutes les options dans la boîte de dialogue.
Je m'attendrais à ce que le second fonctionne de la même manière s'il est possible de spécifier toutes les options. Je suppose que certaines options n'utilisent pas les bons noms ou la bonne syntaxe (Jmp ne fournit malheureusement aucune information de débogage). Voir exemples ci-dessous (fonctionne dans Jmp 14 EA 7)...
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
//This Works when all options in Save Document Matrix are specified:
te=dt<<TEXT explorer=""></TEXT>
En général, la boîte de dialogue Recoder n'est pas scriptable. J'ai transmis vos commentaires à l'équipe de développement de JMP afin qu'ils soient pris en compte dans une future version de JMP.
Merci d'utiliser JMP !
Merci pour votre réponse - peut-être que la distance de Levenshtein vous sera utile un jour.
Je cherche un moyen d'automatiser le dernier bit des plates-formes en scriptant en général. Je suis conscient qu'il n'y a pas de documentation pour cela - ou du moins je ne l'ai pas trouvée - mais comme vous le voyez dans mon premier exemple, il est possible d'éviter la boîte de dialogue modale lorsque toutes les valeurs sont fournies au moment de l'appel. Je ne suis pas sûr que cela fonctionne pour toutes les boîtes de dialogue, mais comme cela a fonctionné pour une seule, je pense qu'il y a de fortes chances que cela fonctionne en général. Sinon, je supplie les développeurs de faire en sorte que cela fonctionne, afin que nous puissions éviter les tâches répétitives et déployer tout le potentiel des plates-formes et des scripts Jmp !
Malheureusement, il n'y a aucun moyen de faire disparaître les boîtes de dialogue modales sans cliquer dessus, à moins que la boîte ne se ferme d'elle-même. Dans ce cas, vous pouvez scripter le recodage vous-même ; le plus difficile serait de trouver ou d'écrire une fonction de distance de chaîne.
Le script ci-dessous peut vous aider à démarrer mais n'utilisez pas cette fonction de distance telle quelle : elle est très inefficace !Une distance de deux sur des mots de 5 caractères c'est beaucoup mais vous pouvez voir que 'JANE', 'JAMES' et 'JOE' deviennent tous 'JANE'.
Names default to here( 1 );
// FUNCTION TO CALCULATE DISTANCE BETWEEN STRINGS
//Rewrite of example C code from wikipedia:
//https://en.wikipedia.org/wiki/Levenshtein_distance
//very inefficient
// len_s and len_t are the number of characters in string s and t respectively
LevenshteinDistance_ = function({s, len_s, t, len_t},
// show(s || char(len_s) || t || char(len_t));
// base case: empty strings
if ( substr( s, 1, len_s ) == substr( t, 1, len_t ), 0, //strings match, distance is zero
len_s == 0, len_t, //s empty, distance is the length of t
len_t == 0, len_s, //t empty, distance is the length of s
// return minimum of delete char from s, delete char from t, and delete char from both
minimum(
LevenshteinDistance_(s, len_s - 1, t, len_t ) + 1,
LevenshteinDistance_(s, len_s , t, len_t - 1) + 1,
LevenshteinDistance_(s, len_s - 1, t, len_t - 1) +
if (substr(s, len_s, 1) == substr(t, len_t, 1), 0, 1) // test if last characters of the strings match
);
);
);
//Wrapper that finds strings lengths for you
LevenshteinDistance = function({s, t}, LevenshteinDistance_(s, length(s), t, length(t)));
// EXAMPLE
//data table
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << New Column( "name recoded", Character, "Nominal" );
//replace names with the first name in the table having a Levenshtein
//distance of two or less when compared to that value
for( i = 1, i <= min(15, N Rows( dt )), i++, //for each row in the table
//if row one always use that value
Column( dt, "name recoded")[i] = if( i == 0, Column( dt, "name")[i], <BR />
newvalue = Column(dt, "name")[i]; //assume you will use this rows' value<BR />
match = 0; //flag indicating that a match is found
for( j = 1, j < i & match == 0, j++, //look at all previous rows to find a match
//if a match use the previous row value and stop looking for more matches
if( LevenshteinDistance( Column(dt, "name")[i], Column(dt, "name")[j] ) <= 2,
newvalue = Column(dt, "name")[j];
match = 1;
)
);
newvalue;
);
);