web-dev-qa-db-ja.com

関数の引数がRに設定されているかどうかをテストする

2つのパラメーター(_p1_と_p2_)を取る関数fがあります。

パラメータ_p2_の値が関数に渡されなかった場合は、代わりに_p1_ ^ 2の値を使用する必要があります。しかし、値が指定されているかどうかにかかわらず、関数内でどのように確認できますか?問題は、値がない場合、変数_p2_が初期化されないことです。したがって、_p2_がNULLであることをテストすることはできません。

_f <- function(p1, p2) {
    if(is.null(p2)) {
        p2=p1^2
    }
    p1-p2
}
_

_p2_の値が関数に渡されたかどうかを確認することはどういうわけか可能ですか? (isset()-関数または同様のものを見つけることができませんでした。)

56
R_User

そのために関数missing()を使用します。

_f <- function(p1, p2) {
    if(missing(p2)) {
        p2=p1^2
    }
    p1-p2
}
_

または、デフォルトでp2の値をNULLに設定できます。ネストされた関数に引数を渡すことができるので、私は時々その解決策を好みます。

_f <- function(p1, p2=NULL) {
    if(is.null(p2)) {
        p2=p1^2
    }
    p1-p2
}

f.wrapper <-function(p1,p2=NULL){
    p1 <- 2*p1
    f(p1,p2)
}
> f.wrapper(1)
[1] -2
> f.wrapper(1,3)
[1] -1
_

編集:missing()でも技術的にこれを行うことができますが、_f.wrapper_にもmissing()ステートメントを含める必要があります。

65
Joris Meys

「?missing」はそれをすべきだと思います。

7
mdsumner

このような場合、次のようなものを使用することもできます。

f <- function(p1, p2 = p1 ^ 2) {
    p1-p2
}

http://adv-r.had.co.nz/Functions.html の遅延評価に関する部分を参照してください

6
Johan