Re: [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

From: Steven McKinney <smckinney_at_bccrc.ca>
Date: Tue, 03 Jun 2008 19:19:49 -0700

Hi Alan,

> -----Original Message-----
> From: r-help-bounces_at_r-project.org on behalf of ALAN SMITH
> Sent: Tue 6/3/2008 6:47 PM
> To: r-help_at_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_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.
>
>

Best

Steve McKinney



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. Received on Wed 04 Jun 2008 - 02:23:43 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Wed 04 Jun 2008 - 02:30:38 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.

list of date sections of archive