[R] help understanding why #function(x, y) (if((x-y)>=0) {2^(x-y)} else{-(2^abs(x-y))})# doesn't work like I think it should

ALAN SMITH alansmith2 at gmail.com
Wed Jun 4 03:47:24 CEST 2008


Hello R users and developers,
I am trying to write several functions (fairly new at this) in order
to avoid using loops on large data frames (because they are slow).  I
wrote the function below and it seems to get hung on the first part of
the if statement and then applies that condition to rest of the
function.  So if (x-y) is greater than 0 the function uses the true
statement for the calculations.   Could someone please offer some
advise on how to write these functions a little better or a type
"apply" that I may use with two (or more) different vectors of data
required by a single functions.
#######################  Examples
#######################################################
## example 1 ###
x<-c(5,6,4,3,5,3,1)
y<-c(1,6,2,1,7,1,9)
folds<-function(x,y) (if((x-y)>=0) {2^(x-y)} else{-(2^abs(x-y))})
z<-folds(x,y)
check<-cbind(x,y,z)
View(check)

Warning message:
In if ((x - y) >= 0) { :
  the condition has length > 1 and only the first element will be used
 ### why will it only use the first element and how to I get around
this ####

## example 2 making the fist comparison negative ###
x1<-c(5,6,4,3,5,3,1)
y1<-c(11,6,2,1,7,1,9)
folds<-function(x,y) (if((x-y)>=0) {2^(x-y)} else{-(2^abs(x-y))})
z1<-folds(x1,y1)
check2<-cbind(x1,y1,z1)
View(check2)
Warning message:
In if ((x - y) >= 0) { :
  the condition has length > 1 and only the first element will be used
################################################################################
#### loop I am trying to avoid writing many many times #####
folds2<-NULL
xy<-as.data.frame(cbind(x,y))
for (i in 1:nrow(xy)) {
diff<-xy$x[i]-xy$y[i]
folds2[i]<-if(diff>=0) {2^diff} else{-(2^abs(diff))}
}
xyz<-cbind(xy,folds2)
View(xyz)
#################

Thank you,
Alan

P.S.  why does ?function not work



More information about the R-help mailing list