# [R] problem applying a conditional formula to each element of a matrix

Domenico Vistocco vistocco at unicas.it
Wed Dec 12 23:45:10 CET 2007

```The conditional have to be a single element:
> ?"if"

cond: A length-one logical vector that is not 'NA'. Conditions of
length greater than one are accepted with a warning, but only
the first element is used.  Other types are coerced to
logical if possible, ignoring any class.

In your case you have a matrix of logical values:
> distance.matrix <= 58.1
1     2     3
1 TRUE  TRUE  TRUE
2 TRUE  TRUE FALSE
3 TRUE FALSE  TRUE

A possible solution (maybe not the better):

Cov.f <- function(h, sigmasq, phi) {
Cij <- h
Cij[h<=phi] <- sigmasq * (1 - ( 1.5 * (Cij[h<=phi]/phi) - 0.5
*(Cij[h<=phi]/phi)^3))
Cij[h>phi] <- 0
return(Cij)
}

domenico

Dale Steele wrote:
> I'm applying a function (Cov.f) defined below to each element of a
> distance matrix.  When I run the code below, I get a warning message
> (below) and elements of returned matrix [2,3] and [3,2] are not zero
> as I would expect. Clearly, there is an error... What am I doing
> wrong? Thanks.  --Dale
>
> Warning message:
> In if (h <= phi) { :
>   the condition has length > 1 and only the first element will be used
>
> # function
>
> Cov.f <- function(h, sigmasq, phi) {
>   if (h <= phi) {Cij <- sigmasq * (1 - ( 1.5 * (h/phi)  - 0.5 *
> (h/phi)^3))  } else
>   if (h > phi)  {Cij <- 0}
>   return(Cij)
>       }
>
> x.coord <- c(5.7, 6.7, 9.8)
> y.coord <- c(42.7, 10.2, 77.4)
> coords <- cbind(x.coord, y.coord)
> distance.matrix <- as.matrix(dist(coords, method="euclidean"))
> distance.matrix
> Cov.f(distance.matrix, 3.9, 58.1)
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help