How to unpack a vector and avoid type mismatches in a user-defined function

I am writing a user-defined function to take a vector of unknown length and to return a vector of the same length the elements of which are the result of applying a simple function to each element of the input.

My problem is that the parser reports type mismatch.

functions{
  real U(vector[] x,  real lo){ 
  int N = size(x);  
  vector[N] result;
  for(i in 1:N){
     result[i] = step( x[i] - lo );
   }
return result;
  }

The parser reports

SYNTAX ERROR, MESSAGE(S) FROM PARSER:
No matches for:

step(vector)

Available argument signatures for step:

step(real)

I realise that step requires a real argument, but I don’t see how to extract each element of x in turn as a real.

Oh, that’s a bit confusing. Without a size vector[] is interpreted as an array of vectors. The function signature you need is

vector U(vector x, real lo) {

No [] anywhere.

1 Like

Thanks. I spend 99% of my time in R and 1% only in Stan and find it hard to recall all the differences.

But I still have a problem:

functions{
  real U(vector x,  real lo){ 
  int N = num_elements(x);  
  vector[N] result;
  for(i in 1:N){
     result[i] = step( x[i] - lo );
   }
  return result;
  }

is rejected also:

SYNTAX ERROR, MESSAGE(S) FROM PARSER:
Mismatched array dimensions.Base type mismatch. Returned expression does not match return type
    LHS type = real; RHS type = vector
Improper return in body of function.
 error in 'model6d9e7451ed81_mre' at line 10, column 0
  -------------------------------------------------
     8:   return result;
     9:   }
       ^
  -------------------------------------------------

result is a vector but you declared the function returns a real. The function signature you need is

vector U(vector x, real lo) {

Note the vector before U.

1 Like

Very many thanks. Works perfectly now.