Hi Alan, > -----Original Message----- > From: [EMAIL PROTECTED] on behalf of ALAN SMITH > Sent: Tue 6/3/2008 6:47 PM > To: r-help@r-project.org > Subject: [R] help understanding why #function(x,y) (if((x-y)>=0) {2^(x-y)} > else{-(2^abs(x-y))})# doesn't work likeI think it should > > 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 ####
You probably want to use ifelse() instead of if() folds <- function(x, y) (ifelse( ((x - y) >= 0), 2^(x - y), -(2^abs(x - y)))) x <- c(5,6,4,3,5,3,1) y <- c(1,6,2,1,7,1,9) folds <- function(x, y) (ifelse( ((x - y) >= 0), 2^(x - y), -(2^abs(x - y)))) z <- folds(x, y) check <- cbind(x, y, z) check R> x <- c(5,6,4,3,5,3,1) R> y <- c(1,6,2,1,7,1,9) R> folds <- function(x, y) (ifelse( ((x - y) >= 0), 2^(x - y), -(2^abs(x - y)))) R> z <- folds(x, y) R> check <- cbind(x, y, z) R> check x y z [1,] 5 1 16 [2,] 6 6 1 [3,] 4 2 4 [4,] 3 1 4 [5,] 5 7 -4 [6,] 3 1 4 [7,] 1 9 -256 > > ## 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 x1 <- c(5,6,4,3,5,3,1) y1 <- c(11,6,2,1,7,1,9) folds <- function(x, y) {ifelse( ((x - y) >= 0), {2^(x - y)}, {-(2^abs(x - y))} ) } z1<-folds(x1,y1) check2<-cbind(x1,y1,z1) check2 R> x1 <- c(5,6,4,3,5,3,1) R> y1 <- c(11,6,2,1,7,1,9) R> folds <- function(x, y) {ifelse( ((x - y) >= 0), {2^(x - y)}, {-(2^abs(x - y))} ) } R> z1<-folds(x1,y1) R> check2<-cbind(x1,y1,z1) R> check2 x1 y1 z1 [1,] 5 11 -64 [2,] 6 6 1 [3,] 4 2 4 [4,] 3 1 4 [5,] 5 7 -4 [6,] 3 1 4 [7,] 1 9 -256 > ################################################################################ > #### 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 It does work in my ESS R session buffer, so it depends on your setup. try R> ?"function" ?function might not work as the R parser doesn't think you have finished typing in the expression (function objects are typically terminated by the final '}' brace). > > ______________________________________________ > R-help@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. > > Best Steve McKinney ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.