[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

Simon Blomberg s.blomberg1 at uq.edu.au
Wed Jun 4 04:07:16 CEST 2008


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.



More information about the R-help mailing list