sqwish
sqwish

Reputation: 79

run multiple lines of code based on ifelse statement

I want to run multiple lines of code based on the results of an if or ifelse statement. The test expression will test the values of a column in a dataframe. Here is my problem:

if statements allow multiple statements to be executed only when the test expression is not a vector:

 if (test_expression) {
       statement1
       statement2
       statement3
    }

ifelse statements allow one statement to be executed when the test expression is a vector:

ifelse(test_expression, statement1, statement2)

However, what if you want to run an if statement on a vector and then run a whole section of code based on the results? In this example, the lines of code I want to run will make a plot. But in reality, I want to go much further than this (send the generated plot as an email attachment).

Example Data:

datetime <- c("12/6/2016 8:00","12/6/2016 8:00","12/6/2016 8:00","12/6/2016 8:00","12/6/2016 8:00","12/6/2016 8:00","12/6/2016 8:00","12/6/2016 8:00","12/6/2016 8:00","12/6/2016 8:00","12/6/2016 10:00","12/6/2016 10:00","12/6/2016 10:00","12/6/2016 10:00","12/6/2016 10:00","12/6/2016 10:00","12/6/2016 10:00","12/6/2016 10:00","12/6/201610:00","12/6/2016 10:00","12/6/2016 10:00","12/6/2016 10:00","12/6/2016 10:00","12/6/2016 10:00","12/6/2016 10:00","12/6/2016 12:00","12/6/2016 12:00","12/6/201612:00","12/6/2016 12:00","12/6/2016 12:00","12/6/2016 12:00","12/6/2016 12:00","12/6/2016 12:00","12/6/2016 12:00","12/6/2016 12:00","12/6/2016 12:00","12/6/201612:00","12/6/2016 12:00","12/6/2016 12:00","12/6/2016 12:00")

c <- c(2.41,1.68,2.29,2.09,3.47,2.28,2.56,2.52,2.27,1.74,2.03,2.14,2.77,2.34,1.78,2.53,2.68,2.27,1.83,1.69,1.83,2.3,2.07,1.91,2.16,3.11,2.38,2.63,2.47,2,2.35,2.11,2.03,3.2,2.17,2.58,2.64,2.23,2.12,2.17)

elev <- c(239.5312,242.8121,246.257,249.5378,252.6874,255.7714,259.2819,262.3331,265.8436,266.8278,222.6283,226.3685,229.7806,232.9302,236.211,239.5247,242.8055,245.9223,249.3344,252.7465,256.0601,259.1441,262.5234,265.9026,266.7885,222.6513,226.3915,229.8692,232.9531,236.2012,239.6133,242.8613,246.2406,249.4558,252.7694,256.0175,259.3639,262.6448,265.86,266.8442)

mydf <- data.frame(datetime,c,elev)

mydf$datetime <- strptime(mydf$datetime, format = "%m/%d/%Y %H:%M")

current.time <- "2016-12-06 12:00:00"

current.time <- paste(format(current.time, format = "%Y-%m-%d %H"), ":00:00", sep = "")

current.date <- "2016-12-06" 

mydf2 <- subset(mydf, datetime == current.time)
mydf2 <- mydf2[order(-mydf2$elev),]

Example if statement:

if(mydf2$c > 2){
  filename<- paste("//C:/Alert_Profile_",current.date, ".pdf", sep="")
  pdf(filename, width=7, height=12)
  plot(0,type="n", ylim = c(216,285), xlim= c(0,35),ylab="Elevation (ft ASL)", xlab=expression('A ('*degree*'C)'))
  lines(mydf2$c, mydf2$elev, xaxt='n', yaxt='n', ylim = c(216,285), xlim= c(0,35), col="mediumpurple1")
  points(mydf2$c, mydf2$elev, xaxt='n', yaxt='n', ylim = c(216,285), xlim= c(0,35), pch=21, col="black", bg= "mediumpurple1")
  dev.off()     
  }

Upvotes: 2

Views: 2690

Answers (1)

Tensibai
Tensibai

Reputation: 15784

If you want to execute a block of code if one of the value of a vector satisfy a condition, there's any which will return true if any value is TRUE.

Your if statement become: if (any(mydf2$c > 2))


Previous answer which may be of use also:

I would set your if condition as a logical vector:

lv <- mydf2$c > 2

Then call your block on subsetted data:

  filename<- paste("//C:/Alert_Profile_",current.date, ".pdf", sep="")
  pdf(filename, width=7, height=12)
  plot(0,type="n", ylim = c(216,285), xlim= c(0,35),ylab="Elevation (ft ASL)", xlab=expression('A ('*degree*'C)'))
  lines(mydf2$c[lv], mydf2$elev[lv], xaxt='n', yaxt='n', ylim = c(216,285), xlim= c(0,35), col="mediumpurple1")
  points(mydf2$c[lv], mydf2$elev[lv], xaxt='n', yaxt='n', ylim = c(216,285), xlim= c(0,35), pch=21, col="black", bg= "mediumpurple1")
  dev.off()    

Or I may have not understood what you're after, as your question doesn't provide an expected output it's hard to tell, your example code will run or not depending on the first value of mydf2$cand raise a warning about this:

> d
[1] 1 2 3 4 5
> if (d > 3) { print("ok")} 
Warning message:
In if (d > 3) { :
  the condition has length > 1 and only the first element will be used

Upvotes: 1

Related Questions