Map Value函数:后续调用结果不一致你好,
我是 JMP 16 和 JSL 的新手,但我是一位经验丰富的程序员。
由于某些原因,我想使用“映射值”功能,但这给了我错误的结果。
我想要实现的是从包含数字和字符串的列表中删除作为列表给出的不需要的项目
以下函数从 na_list 中构造一个名为 na_values 的“Map Value”列表,其形式为 {option1, 0, option2, 0, ...},例如 {option1, option2 ,...}
并使用“Filter Each”和“Map Value”功能对其进行过滤。
wrap = function({filtered list,na_list}, {Default Local},
na_values={};For Each( {value}, na_list, na_values=Insert(na_values,value);na_values=Insert(na_values,1););
return(Filter Each({value}, filtered list, Map Value(value, na_values, Unmatched(0))==0;));
);但如果我使用其他参数再次调用该函数,则会给出错误的结果:
Show(wrap({"b",1, 2, 3},{"b"})); // <-- returns {1,2,3} => OK
Show(wrap({"d",1, 2, 3},{"d"})); // <-- returns {"d",1,2,3} => NOT OK, should be as above {1,2,3]
这里有什么问题吗? JMP 中的错误? 我使用的是版本 16.0.0 (512257)。
此致,
托马斯
消费者和市场研究数据探索和可视化分享和交流结果视窗回复:映射值函数:不同字符的错误结果JMP支持已经回答了我,这可能是我发现的一个缺陷。
他们的支持为我提供了以下解决方案来解决我最初的问题,即使用关联数组函数从列表中删除不需要的项目:
filtered list = {"b", 1, 2, 3};
na_list = {"b"};
result = Associative Array(filtered list) << Remove(Associative Array(na_list)) << Get Keys; // {1, 2, 3}回复:映射值函数:不同字符的错误结果感谢您的回复。 正如您所说,第一个调用有效,后续调用失败。
我已就此问题致电我们的 JMP 支持人员,该支持人员已将此问题提交给其技术支持团队。 如果我收到任何消息,我会将其发布在这里。
回复:映射值函数:不同字符的错误结果在你的例子中
Show(wrap({"b",1, 2, 3},{"b"}));
Show(wrap({"d",1, 2, 3},{"d"}));
没有给出第二次调用的正确结果。
但这有效:
Show(wrap({"d",1, 2, 3},{"d"}));
这表明您不需要到处进行评估。
问题是第一次调用该函数有效,而后续调用失败;这很奇怪。
回复:映射值函数:不同字符的错误结果你好,你是对的,我从我的测试函数中删除了 na_values 的初始化。
但如果我将 na_values 的初始化添加到函数中,问题就存在:
wrap = function({filtered list,na_list}, {Default Local},
<STRONG>na_values={}</STRONG>;For Each( {value}, na_list, na_values=Insert(na_values,value);na_values=Insert(na_values,1););
return(Filter Each({value}, filtered list, Map Value(value, na_values, Unmatched(0))==0;));
);
Show(wrap({"b",1, 2, 3},{"b"})); // = {1, 2, 3}=> OK
Show(wrap({"d",1, 2, 3},{"d"})); // = {"d", 1, 2, 3} => Not OK ! => expected {1, 2, 3}请自己尝试上面的代码。
回复:映射值函数:不同字符的错误结果我不确定如果不首先将 na_value 初始化为空列表,您如何让函数正常工作。这有效:
names default to here(1);
filtered list = {"d",1, 2, 3};
na_list = {"d"};
na_values = {}; // <--- missing
For Each( {value}, na_list,
na_values=Insert(na_values,value);
na_values=Insert(na_values,1);
);
f = Filter Each({value}, filtered list,
Map Value(value, na_values, Unmatched(0))==0;
);
show(f);回复:映射值函数:不同字符的错误结果有时,JMP / JSL 处理表达式的方式可能很奇怪 - 例如,在发送函数中,参数经常在未计算的情况下发送。虽然这里没有发送功能,但似乎在过滤每个()或者映射值()以奇怪的方式处理参数并奇怪地处理查找。
基本上,我不能说这是一个错误,但它看起来确实很奇怪。如果我是您,我会联系 JMP 支持并向他们展示第一个电话(无论是{"b",1,2,3"}或者{“d”,1,2,3} )有效,而第二个无效。可能这是一个错误。
这是一个解决方法:
wrap = Function( {filtered list, na_list},
{Default Local},
na_values = {};
For Each( {value}, na_list,
Insert Into( na_values, value );
Insert Into( na_values, 1 );
);
Eval( Eval Expr( Filter Each( {value}, filtered list, Map Value( value, Expr( na_values ), Unmatched( 0 ) ) == 0 ) ) );
);