如何能够自动化需要从模式对话框输入的平台的输出?
下面是两个例子。第一个在指定对话框中的所有选项时有效。
如果可以指定所有选项,我希望第二个以相同的方式工作。我的猜测是某些选项没有使用正确的名称或语法(不幸的是,Jmp 不提供任何调试信息)。请参阅下面的示例(适用于 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>
通常,“重新编码”对话框不可编写脚本。 我已将您的反馈传递给 JMP 开发团队,以供在 JMP 的未来版本中考虑。
感谢您使用 JMP!
谢谢你的回复——也许有一天 Levenshtein 距离会派上用场。
我正在寻找一种通过一般脚本来自动化平台最后一点的方法。 我知道没有这方面的文档 - 或者至少我找不到它 - 但正如您在我的第一个示例中看到的,当在调用时提供所有值时,可以避免模式对话框。 我不确定它是否适用于所有对话框,但由于它适用于一个对话框,我相信这很有可能一般都有效。 否则,我恳请开发人员完成这项工作,这样我们就可以避免重复性任务并充分发挥平台和 Jmp 脚本的潜力!
不幸的是,没有办法让模态对话框在不单击它们的情况下消失,除非该框自行关闭。 在这种情况下,您可以自己编写重新编码脚本;最困难的部分是查找或编写字符串距离函数。
下面的脚本可能会帮助您入门,但不要按原样使用此距离函数:它的效率非常低!5 个字符的单词之间的距离很大,但您可以看到“JANE”、“JAMES”和“JOE”都变成了“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;
);
);