- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Report Inappropriate Content
Map Value function: Inconsistent results for subsequent calls
Hello,
I am new to JMP 16 and JSL but I am an experienced programmer.
For some reasons I want to use the "Map Value" function but this gives me wrong results.
What i want to achieve is to remove unwanted items given as a list from a list containing numbers and strings
The following function constructs a list for "Map Value" named na_values in the form {option1, 0, option2, 0, ...} from the na_list e.g. {option1, option2 ,...}
and filters it using "Filter Each" and the Map Value" function.
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;));
);
But it gives a wrong result if I call the function again with other parameters:
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]
What is wrong here? A bug in JMP? I am using version 16.0.0 (512257).
Best regards,
Thomas
Accepted Solutions
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Report Inappropriate Content
Re: Map Value function: Wrong results for different characters
The JMP support has answered me, it may be a defect which I have found.
Their support gave me the following solution to my original problem to remove unneeded items from a list using the Associative Array function:
filtered list = {"b", 1, 2, 3};
na_list = {"b"};
result = Associative Array(filtered list) << Remove(Associative Array(na_list)) << Get Keys; // {1, 2, 3}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Report Inappropriate Content
Re: Map Value function: Wrong results for different characters
Sometimes JMP / JSL can be weird in how it handles expressions -- for instance, often times in a send function the arguments are sent unevaluated. Although there is no send function here it would seem that something within the Filter Each()
or Map Value()
handles arguments in a weird way and handles the lookup oddly.
Basically, I cannot say that it is a bug but it does seem weird. If I were you I'd contact JMP Support and show them that the first call (whether it's the {"b",1,2,3"}
or the {"d",1,2,3}
) works, while the second does not work. Possible that it's a bug.
Here is a work-around:
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 ) ) );
);
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Report Inappropriate Content
Re: Map Value function: Wrong results for different characters
I'm not sure how you got your function to work without first initialising na_value as an empty list. This works:
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);
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Report Inappropriate Content
Re: Map Value function: Wrong results for different characters
Hello, you are right, I removed the initialization of na_values from my test function.
But the problem exists if I add the initialization of na_values to the function:
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"})); // = {1, 2, 3}=> OK
Show(wrap({"d",1, 2, 3},{"d"})); // = {"d", 1, 2, 3} => Not OK ! => expected {1, 2, 3}
Please try yourself the above code.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Report Inappropriate Content
Re: Map Value function: Wrong results for different characters
In your example
Show(wrap({"b",1, 2, 3},{"b"}));
Show(wrap({"d",1, 2, 3},{"d"}));
doesn't give the correct results for the 2nd call.
But this works:
Show(wrap({"d",1, 2, 3},{"d"}));
Which would suggest that you shouldn't need to throw evals all over the place.
The issue is that the 1st call to the function works, and subsequent calls fail; which is very strange.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Report Inappropriate Content
Re: Map Value function: Wrong results for different characters
Thanks for your reply. As you have said the first call works, the subsequent calls fail.
I have called our JMP support about this problem which has given this issue to its technical support team. If I get any news to that I will post it here.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Get Direct Link
- Report Inappropriate Content
Re: Map Value function: Wrong results for different characters
The JMP support has answered me, it may be a defect which I have found.
Their support gave me the following solution to my original problem to remove unneeded items from a list using the Associative Array function:
filtered list = {"b", 1, 2, 3};
na_list = {"b"};
result = Associative Array(filtered list) << Remove(Associative Array(na_list)) << Get Keys; // {1, 2, 3}