2017-12-05 12 views
1

私はエラー/警告の場合に別の関数を実行させたい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

errorおよびwarningは、1つの引数の機能を使用します。これは正常に動作します:

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 
関連する問題