2017-12-05 6 views
1

오류/경고 발생시 다른 기능을 실행하려는 tryCatch 함수를 사용하고 있습니다. 이 다른 함수는 일부 인수에 따라 다르며 어떤 이유로 인해 tryCatch은 오류 및 경고 함수 일 때 tryCatch을 인식하지 못합니다. 여기 저도 같은 문제에 직면하고있어 단순화 된 기능입니다 :오류/경고 발생시 tryCatch에서 함수 실행

essai <- function(x){ 
y <- 2 
result <- tryCatch({ 
    sqrt(x*y) 
} , warning = function(cond,x,y) { 
    message(cond) 
    sqrt(abs(x*y)) 
} , error = function(cond,x,y) { 
    message(cond) 
    sqrt(abs(x*y)) 
} , finally = { 
    message("done") 
}) 
} 

nbs <- c(1,2,3,-1,-2) 
lapply(nbs, essai) 

그러나 나는 여기 Error in value[[3L]](cond) : argument "x" is missing, with no default를라는 오류 메시지가 있습니다. R은 실패한 함수에서 사용 된 x와 y를 재사용해야한다는 것을 이해하지 못합니다. 이유는 무엇입니까?

+0

경고/오류 함수에서 x와 y를 y로 전달하는 이유는 무엇입니까? 꼭해야 할 이유가 없습니다. 그러나 x/y 매개 변수를 경고/오류 함수로 제거하면 x와 y를 호출하는 환경에서 잡아낼 수 있기 때문에 직접 사용할 수 있습니다. 사이드 노트에서 나는이 경우에 직접'sqrt (abs (x * y))'를 사용할 수 있기 때문에 이것이 실제 유스 케이스가 아니라고 가정해야한다. – Dason

+0

예, 실제로 인공적이며 단순화 된 기능으로 내 문제가 재현됩니다. 어떤 경우에는 인수를 넣을 지 명확하지 않지만 – Anais

+0

'무엇을 의미하는지 모르겠습니다. 오류/경고 기능은 추가 인수를 취할 수 없기 때문에 인수를 넣거나 갖지 않습니다. – Dason

답변

2

errorwarning은 하나의 인수를 취합니다. 이 잘 작동 : 인수의

essai <- function(x, cond = 'problem'){ 
    y <- 2 
    result <- tryCatch({ 
    sqrt(x*y) 
    } , warning = function(w) { 
    message(cond) 
    sqrt(abs(x*y)) 
    } , error = function(e) { 
    message(cond) 
    sqrt(abs(x*y)) 
    } , finally = { 
    message("done") 
    }) 
} 

나머지는 당신의 essai 기능에 지정 될 수 있으며, 경고 및 오류에서 모두 사용할 수 있습니다.

nbs <- c(1,2,3,-1,-2) 
lapply(nbs, essai) 
#done 
#done 
#done 
#problem 
#done 
#problem 
#done 
# [[1]] 
# [1] 1.414214 
# 
# [[2]] 
# [1] 2 
# 
# [[3]] 
# [1] 2.44949 
# 
# [[4]] 
# [1] 1.414214 
# 
# [[5]] 
# [1] 2