2017-11-22 14 views
0

I持って次の関数:テスト未評価の約束が存在する場合

f <- function(a, b=list()) { 
    if(exists("b")) { 
    if(exists("x",b)){ 
     a+b[["x"]] 
    } else { 
     a 
    } 
    } else { 
    -a 
    } 
} 

そして、それは私がbのための未定義の値を入れるとき以外は、仕事だ:

exists("tmp") 
# [1] FALSE 
f(a = 1, b=tmp) 
# Error in exists("x", b) : object 'tmp' not found 

がいるかどうかをチェックする機能があります私の関数の中に約束の値がありますf

+0

私の例では、 'missing(b)'は 'False'です。関数の引数として' b = tmp'があります。 – rconradin

答えて

1

このようなものはどうですか。

f <- function(a, b=list()) { 
    tryCatch(force(b), error=function(e) b<<-NULL) 
    if(!is.null(b)) { 
    if(exists("x",b)){ 
     a+b[["x"]] 
    } else { 
     a 
    } 
    } else { 
    -a 
    } 
} 

f(5, tmp) 
# [1] -5 
f(5, list(x=3)) 
# [1] 8 
f(5, list(z=3)) 
# [1] 5 

ここでは、それは変数が存在しない場合に対処するためにtryCatch()式の中で何かに存在するか解決するかどうかを確認するために、パラメータの評価を強制します。存在しない場合は、関数の残りの部分をより使いやすくするためにNULLに設定します。

関連する問題