R function length error message

I made a function to to compute the sum of I(Xi

my.ecdf<- function(x,y) {
  if(!is.null(dim(y)))
    stop("y has more than one dimension")
  n<-length(x)
  i<-1:n 
  p<-if(x[i]<y) 1 else {
    0
  }
  (sum(p))/n
}

But when I run it with input (rnorm(11),6), I get this error:

Warning message:
In if (x[i] < y) 1 else { :
  the condition has length > 1 and only the first element will be used

Any ideas? I'm new to r so sorry if it's something obvious. (Also I don't want to use the for loop)

Upvotes: 0

Views: 367

Answers (2)

Aleh
Aleh

Reputation: 826

There are a number of issues in your code:

1) Whats the point of x[1:length(x)] in the if statement? Right now these are meaningless and can be dropped:

  n<-length(x)
  i<-1:n 
  x[i]

2) If statement accepts a logical argument not a vector of logical, you can consider adding all() any() etc like

  if(all(x < y)) 1 else {0}

or use ifelse() statement for the assignment

3) Finally from what I can understand you overcomplicate things and the whole thing can be written as one-liner:

  sum(x < y)/length(x)

Upvotes: 1

De Novo
De Novo

Reputation: 7610

This is a logical vector of the same length as y

is.null(dim(y)) 

You're using it as a logical test. An object with a length greater than 1 can't be unambiguously interpreted by the if statement. Consider if (TRUE FALSE FALSE TRUE) <do something>. When should you do that thing?

If you want to make sure y doesn't have more than one dimension, do

if(length(dim(y)) > 1){
    stop("message")
}

Upvotes: 1

Related Questions