Wie ist es möglich, die Ausgabe von Plattformen zu automatisieren, die eine Eingabe aus einem modalen Dialogfeld erfordern?
Nachfolgend finden Sie zwei Beispiele. Das erste funktioniert, wenn alle Optionen im Dialogfeld angegeben werden.
Ich würde erwarten, dass die zweite Option genauso funktioniert, wenn es möglich ist, alle Optionen anzugeben. Ich vermute, dass einige Optionen nicht die richtigen Namen oder Syntax verwenden (Jmp stellt leider keine Debugging-Informationen bereit). Siehe Beispiele unten (funktioniert in 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>
Im Allgemeinen ist der Recode-Dialog nicht skriptfähig. Ich habe Ihr Feedback an das JMP-Entwicklungsteam weitergeleitet, damit es in einer zukünftigen Version von JMP berücksichtigt werden kann.
Vielen Dank, dass Sie JMP verwenden!
Vielen Dank für Ihre Antwort - vielleicht wird die Levenshtein-Distanz eines Tages nützlich sein.
Ich suche nach einer Möglichkeit, das letzte Bit der Plattformen durch Skripting im Allgemeinen zu automatisieren. Mir ist bewusst, dass es dafür keine Dokumentation gibt – oder zumindest konnte ich sie nicht finden – aber wie Sie in meinem ersten Beispiel sehen, ist es möglich, das modale Dialogfeld zu vermeiden, wenn alle Werte zum Zeitpunkt des Aufrufs bereitgestellt werden. Ich bin mir nicht sicher, ob es für alle Dialogfelder funktioniert, aber da es für eines funktioniert hat, glaube ich, dass es eine gute Chance gibt, dass dies im Allgemeinen funktioniert. Ansonsten appelliere ich an die Entwickler, dies zum Laufen zu bringen, damit wir sich wiederholende Aufgaben vermeiden und das volle Potenzial der Plattformen und des Jmp-Skriptings entfalten können!
Leider gibt es keine Möglichkeit, modale Dialogfelder verschwinden zu lassen, ohne darauf zu klicken, es sei denn, das Feld schließt sich von selbst. In diesem Fall könnten Sie die Umcodierung selbst skripten; Der schwierigste Teil wäre, eine Zeichenfolgenabstandsfunktion zu finden oder zu schreiben.
Das folgende Skript könnte Ihnen den Einstieg erleichtern, aber verwenden Sie diese Abstandsfunktion nicht so wie sie ist: Sie ist sehr ineffizient!Ein Abstand von zwei bei Wörtern mit 5 Zeichen ist viel, aber Sie können sehen, dass „JANE“, „JAMES“ und „JOE“ alle zu „JANE“ werden.
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;
);
);