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
Use ifelse() rather than if () {} else {}. It's vectorized and very
useful for applying to elements along vectors. The latter idiom is much
better for control of flow in programs and functions.
folds <- function (x, y) ifelse(x-y >= 0, 2^(x-y), -(2^abs(x-y)))
z <- folds(x, y)
z
[1] 16 1 4 4 -4 4 -256
?function works for me. Here's my setup: R version 2.7.0 (2008-04-22) x86_64-pc-linux-gnu Cheers, Simon.
On Tue, 2008-06-03 at 20:47 -0500, ALAN SMITH wrote:
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
______________________________________________ R-help at 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.
Simon Blomberg, BSc (Hons), PhD, MAppStat. Lecturer and Consultant Statistician Faculty of Biological and Chemical Sciences The University of Queensland St. Lucia Queensland 4072 Australia Room 320 Goddard Building (8) T: +61 7 3365 2506 http://www.uq.edu.au/~uqsblomb email: S.Blomberg1_at_uq.edu.au Policies: 1. I will NOT analyse your data for you. 2. Your deadline is your problem. The combination of some data and an aching desire for an answer does not ensure that a reasonable answer can be extracted from a given body of data. - John Tukey.