[R] Simplify simple code

Charilaos Skiadas skiadas at hanover.edu
Mon Apr 16 08:25:47 CEST 2007


On Apr 16, 2007, at 1:37 AM, Dong-hyun Oh wrote:
> Dear expeRts,
>
> I would simplify following code.
> ---------------------------------------------
> youtput <- function(x1, x2){
>    n <- length(x1)
>    y <- vector(mode="numeric", length=n)
>    for(i in 1:n){
>      if(x1[i] >=5 & x1[i] <= 10 & x2[i] >=5 & x2[i] <=10)
>        y[i] <- 0.631 * x1[i]^0.55 * x2[i]^0.65
>      if(x1[i] >=10 & x1[i] <= 15 & x2[i] >=5 & x2[i] <=10)
>        y[i] <- 0.794 * x1[i]^0.45 * x2[i]^0.65
>      if(x1[i] >=5 & x1[i] <= 10 & x2[i] >=10 & x2[i] <=15)
>        y[i] <- 1.259 * x1[i]^0.55 * x2[i]^0.35
>      if(x1[i] >=10 & x1[i] <= 15 & x2[i] >=10 & x2[i] <=15)
>        y[i] <- 1.585 * x1[i]^0.45 * x2[i]^0.35
>    }
>    y
> }
> ----------------------------------------------
> Anyone can help me?
>
I hope someone comes up with something better, but here is one way:

youtput <- function(x1, x2) {
	co1 <- matrix(c(0.631,0.794,1.259,1.585), c(2,2))
	co2 <- c(0.55,0.45)
	co3 <- c(0.65,0.35)
	p1 <- findInterval(x1,c(5,10,15))
	p2 <- findInterval(x2,c(5,10,15))
	return( diag(co1[p1,p2]) * x1^co2[p1] * x2^co3[p2] )
}

It is not clear at all what you wanted to happen when x1 and/or x2 is  
not between 5 and 15, so I did not deal with those case. The above  
command will choke in that case, and should be modified accordingly  
depending on what you want.

> Sincerely,
>
> ===========================================
> Dong H. Oh
>
> Ph. D Candidate
> Techno-Economics and Policy Program
> College of Engineering, Seoul National University,
> Seoul, 151-050, Republic of Korea
>
> E-mail:doriaba2 at snu.ac.kr
> Mobile: +82-10-6877-2109
> Office : +82-2-880-9142
> Fax: +82-2-880-8389

Haris Skiadas
Department of Mathematics and Computer Science
Hanover College



More information about the R-help mailing list