2016-12-07 3 views
1

if 또는 ifelse 문을 기반으로 여러 줄의 코드를 실행하고 싶습니다. 테스트 표현식은 데이터 프레임의 열 값을 테스트합니다.ifelse 문을 기반으로 여러 줄의 코드를 실행하십시오.

if (test_expression) { 
     statement1 
     statement2 
     statement3 
    } 

ifelse이 문을 하나의 문이 테스트 표현식이 벡터 때 실행 될 수 있도록 :

if 문이 테스트 표현식은 벡터가 아닌 경우 여러 문장 만 실행 할 수 있습니다 : 여기 내 문제가 있습니다 :

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 (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의 $의 c' 값 중 하나가 2를 초과 할 때 mydf2' '의 줄거리 만 그래서 모든 값으로 플롯을 제한하지 않을 것입니다 2를 초과하지만, 오히려 1 이상이 초과 할 때 모두 음모를 꾸미십시오. 마찬가지로, 2를 초과하지 않으면 음모를 내고 싶지 않습니다. – sqwish

+0

그럼'if (mydf2 $ c 2)'를'if (any (myfdf2 $ c> 2)) '로 바꾸십시오. – Tensibai

+1

duhhhhhhhhh ......... 정말 고마워요! 위의 해결책을 포함하도록 답을 편집 할 수 있습니까? 다른 사람들에게 도움이 될 수 있습니다. – sqwish

관련 문제