Subscribe Bookmark RSS Feed

User-Defined Function: How to pass output variable value to another variable

shaira

Contributor

Joined:

May 4, 2017

Hi, I am making a code that validates user input. The user input are two lists, B and C. The output is list A, which contains all the items that are contained in both B and C. Here is the code:

//CHECK IF USER INPUT MAKES SENSE 
Caption("Checking input data...");
col_name_list = dt << get column names( string );

//Check if there are duplicate or missing inputs
//Create a User-Defined Function
ColCheck=Function({main, second}, {duplicate},
	(duplicate={};  Show (duplicate);
	For (i=1, i<=Nitems(main), i++,
		 //Check if there are missing columns from user input
		 If ( !Contains( col_name_list, main[i] ),
			  Write("WARNING! Column " || main[i] ||" does not exists. Creating data column.");
			  Caption("WARNING! Column " || main[i] ||" does not exists. Creating data column.");
			  Wait( 1 );
			  script1 = "dt<<New Column(\!"" || main[i] ||"\!", numeric, continuous);";
			  script1 = Eval( Parse( script1 ) );
			 );
		 //Check if there are overlap columns between two lists
		 For (j=1, j<=Nitems(second), j++,
		 	  If ( second[j] == main[i],
				   duplicate=Insert(duplicate,second[j]); Show (duplicate);
				 );
			 );	
		);
)
);
//Quick test to show if function is working	
A={}; Show(A);
B={"one", "two", "three"};
C={"four", "five", "three", "two"};
A=ColCheck(B,C);
Show(A);

Here is the output:

A = {};
duplicate = {};
duplicate = {"two"};
duplicate = {"two", "three"};
A = .;

The functions works, as seen from the values of "duplicate" variable.  The problem is this: the duplicate content cannot be passed to variable "A". Is there anything wrong with my code?

 

1 ACCEPTED SOLUTION

Accepted Solutions
txnelson

Super User

Joined:

Jun 22, 2012

Solution

What is passed back from a JMP function or Format is the last value processed, therefore if you add "duplicate" as the last item, it works great.

ColCheck = Function( {main, second},
	{duplicate},
	duplicate = {};
	Show( duplicate );
	For( i = 1, i <= N Items( main ), i++, 
		 //Check if there are missing columns from user input
		If( !Contains( col_name_list, main[i] ),
			Write( "WARNING! Column " || main[i] || " does not exists. Creating data column." );
			Caption( "WARNING! Column " || main[i] || " does not exists. Creating data column." );
			Wait( 1 );
			script1 = "dt<<New Column(\!"" || main[i] || "\!", numeric, continuous);";
			script1 = Eval( Parse( script1 ) );
		);
		 //Check if there are overlap columns between two lists
		For( j = 1, j <= N Items( second ), j++,
			If( second[j] == main[i],
				duplicate = Insert( duplicate, second[j] );
				Show( duplicate );
			)
		);
	);
	duplicate;
);
Jim
2 REPLIES
txnelson

Super User

Joined:

Jun 22, 2012

Solution

What is passed back from a JMP function or Format is the last value processed, therefore if you add "duplicate" as the last item, it works great.

ColCheck = Function( {main, second},
	{duplicate},
	duplicate = {};
	Show( duplicate );
	For( i = 1, i <= N Items( main ), i++, 
		 //Check if there are missing columns from user input
		If( !Contains( col_name_list, main[i] ),
			Write( "WARNING! Column " || main[i] || " does not exists. Creating data column." );
			Caption( "WARNING! Column " || main[i] || " does not exists. Creating data column." );
			Wait( 1 );
			script1 = "dt<<New Column(\!"" || main[i] || "\!", numeric, continuous);";
			script1 = Eval( Parse( script1 ) );
		);
		 //Check if there are overlap columns between two lists
		For( j = 1, j <= N Items( second ), j++,
			If( second[j] == main[i],
				duplicate = Insert( duplicate, second[j] );
				Show( duplicate );
			)
		);
	);
	duplicate;
);
Jim
shaira

Contributor

Joined:

May 4, 2017

Thanks Jim. It's working now.

 

Best,

Shaira