[GRASSLIST:3366] Re: r.mapcalc syntax

Glynn Clements glynn.clements at virgin.net
Thu May 6 17:42:51 EDT 2004


Ulrich Leopold wrote:

> I am using the following command and get an parse error expecting ")"
> 
> r.mapcalc Errors="if('VAL.stone.lsk_OK.DIFF_SQRT_VAR' < -2,
> ('500.Pox0t30.STONE' - ('Pox0t30_OK_block.pred.LSK' - (2 *
> (sqrt('Pox0t30_OK_block.var.LSK')))/('500.Pox0t30.STONE') * -100),
> null() ))"
> 
> parse error, expecting ")"
> Parse error
> 
> What am I doing wrong. I checked the position of the parenthesis. But I
> cannot figure out where a parenthesis is missing. The similar command
> works in the statistics package 'R'.

First, I'll replace the map names by X to make the structure more
clear:

	if(X < -2, (X - (X - (2 * (sqrt(X)))/(X) * -100), null() ))

Look at the nesting of the parentheses:


	if(X < -2, (X - (X - (2 * (sqrt(X)))/(X) * -100), null() ))
	           -----------------------------------------------
	  ---------------------------------------------------------

This expression has the form:

	if(A, (B, C))

where:
	A ==	X < -2
	B ==	X - (X - (2 * (sqrt(X)))/(X) * -100)
	C ==	null()

However, (B,C) isn't a valid expression. You probably wanted to omit
the parentheses to give:

	if(A, B, C)

which is valid.

So, your command should probably be:

r.mapcalc Errors="if('VAL.stone.lsk_OK.DIFF_SQRT_VAR' < -2,
'500.Pox0t30.STONE' - ('Pox0t30_OK_block.pred.LSK' - (2 *
(sqrt('Pox0t30_OK_block.var.LSK')))/('500.Pox0t30.STONE') * -100),
null())"

Regarding the reason why the error message says "expecting ')'":

When the parser gets to:

	if(A, (B,

it can't parse the comma, because a comma is only valid within a
function's argument list. However, if there had been a closing
parenthesis before the comma, it would have:

	if(A, (B),

The comma would be part of the argument list for if(), and so would be
valid. Hence the "expecting ')'" message.

-- 
Glynn Clements <glynn.clements at virgin.net>




More information about the grass-user mailing list