2016-12-07 120 views
1

我想根據ififelse語句的結果運行多行代碼。測試表達式將測試數據框中列的值。這裏是我的問題:基於ifelse語句運行多行代碼

if語句允許當測試表達式不是一個向量只執行多個語句:

if (test_expression) { 
     statement1 
     statement2 
     statement3 
    } 

ifelse語句允許當測試表達式是一個矢量要執行一個語句:

ifelse(test_expression, statement1, statement2) 

但是,如果你想要運行在一個向量的if語句,然後運行基於結果的代碼一整節?在這個例子中,我想要運行的代碼行會生成一個圖。但實際上,我想要比這更進一步(將生成的情節作爲電子郵件附件發送)。

示例數據:

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),] 

if聲明:

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()  
    } 

回答

1

如果你想如果一個矢量值的一個滿足條件時執行的代碼塊,有any這將如果任何值爲TRUE,則返回true。

你的if語句變成:if (any(mydf2$c > 2))


以前的答案可能是使用同樣的:

我會設置你的,如果條件作爲邏輯矢量:

lv <- 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[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()  

或者我可能還沒有理解你在做什麼,因爲你的問題沒有提供預期的輸出,所以很難說,你的示例代碼將運行或不運行,取決於第一個值mydf2$c,並提出警告:

> 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 
+0

對不起,我的預期輸出是'mydf2'的圖,只有當'mydf2 $ c'的值之一超過2時。所以我不想將繪圖限制爲所有的值超過2個,而是在1個或更多超過時繪製所有這些。同樣,如果沒有超過2,我不想做一個情節。 – sqwish

+0

然後只要把你的'if(mydf2 $ c 2)'變成'if(any(myfdf2 $ c> 2))' – Tensibai

+1

duhhhhhhhhh .........非常感謝!你可以編輯你的答案,包括上述解決方案?這可能對其他人有幫助。 – sqwish