2016-09-07 8 views
3

for 루프 내의 연산이 R 인 경우 for 루프의 다음 반복으로 이동하는 간단한 방법을 찾고 있습니다.오류가있는 경우 for 루프의 다음 루프 반복

나는 간단한 경우 아래 다시 한 :

for(i in c(1, 3)) { 
    test <- try(i+1, silent=TRUE) 
    calc <- if(class(test) %in% 'try-error') {next} else {i+1} 
    print(calc) 
} 

이 올바르게 나에게 다음과 같은 CALC 값을 제공합니다. 루프

for(i in c(1, "a", 3)) { 
    test <- try(i+1, silent=TRUE) 
    calc <- if(class(test) %in% 'try-error') {next} else {i+1} 
    print(calc) 
} 

이 작동하지 않습니다

[1] 2 
[1] 4 

그러나 나는 숫자가 아닌 값을 포함하는 전에서 벡터를 변경하면. 나는 i에서 비 숫자 값을 제외한 벡터와 같은 calc 값을 원했습니다.

나는 다음과 같은 tryCatch를 사용하여 시도 : 그러나

for(i in c(1, "a", 3)) { 
    calc <- tryCatch({i+1}, error = function(e) {next}) 
    print(calc) 
} 

, 나는 다음과 같은 오류 얻을 :

Error in value[[3L]](cond) : no loop for break/next, jumping to top level 

누군가가 제가에서 루프를 사용하여이를 얻을 수있는 방법을 이해하는 데 도움이 시겠어요을 아르 자형?

+3

'c (1, "a", 3)'이 실제로 무엇인지 검사 할 수 있습니다. 나는 중간 요소 만이 성격이라고 믿는다. 그러나 그것은 틀렸다. – Dason

+2

왜 이렇게하려고하는지 잘 모르겠습니다. 이것은 단순한 예입니까? 그렇지 않은 경우 입력 벡터에서 'as.numeric'을 사용하면 문자가 NA로 변환됩니다. 그것으로 주변을 놀아 라. as.numeric (c (1, "k", 3 ")) + 1' – Dason

+0

@Dason 실제로 for 루프 예제 내에서 제어 흐름의 오류 처리에 더 관심이있다. 내가 가진 더 큰 스크립트의 간단한 경우. 나는 'Error'를 던지는 시나리오를 재현하기 위해 문자 요소를 넣음으로써 벡터의 정의를 위반했다. 희망이 내 질문을 명확히합니다. – ed0reddie

답변

1

Dason이 지적했듯이 원자 벡터는 실제로 혼합 데이터 형식을 저장하는 가장 좋은 방법은 아닙니다. 목록이 있습니다. 다음을 고려하십시오.

l = list(1, "sunflower", 3) 

for(i in seq_along(l)) { 
    this.e = l[[i]] 
    test <- try(this.e + 1, silent=TRUE) 
    calc <- if(class(test) %in% 'try-error') {next} else {this.e + 1} 
    print(calc) 
} 

[1] 2 
[1] 4 

즉, 이전 루프가 "작동했습니다". 그것은 단지 항상 실패하고 다음 반복에 갔다.

0

다음은 도움이 될 수있는 "purr"패키지를 사용하는 솔루션입니다. 그것은 당신의 목록 또는 벡터를 통과하고

#Wrap the function you want to use in the adverb "safely" 
safetest <- safely(function(x){ifelse(is.na(as.numeric(x)), 
            x+1, 
            as.numeric(x)+1)}) 

myvect<-c(1,"crumbs",3) #change to list if you want a list 

#Use the safe version to find where the errors occur 
check <- myvect %>% 
    map(safetest) %>% 
    transpose %>% .$result %>% 
    map_lgl(is_null) 

myvect[check] 

#This returns the results that did not through an error 
#first remove NULL elements then flatten to double. 
#The two flatten expresiion can be replaced by a single unlist 
myvect %>% 
    map(safetest) %>% 
    transpose %>% .$result %>% 
    flatten()%>%flatten_dbl() 

원래 예를 들어 https://blog.rstudio.org/2016/01/06/purrr-0-2-0/ 참조 오류를 야기 할 요소를 반환합니다.