2016-01-22 19 views
5

正式なファンクション引数に関数外のデフォルト値があるかどうかを確実にどのように伝えることができますか?以下の例ではファンクション引数のデフォルトなし

、私は以下のテストは、引数を持っているか、デフォルト値を持たないときに見つけることが失敗しないことを保証したいと思います:

myfun <- function(a, b=1, ...) {} 
formals(myfun) 
for (n in names(formals(myfun))) { 
    if (is.name(formals(myfun)[[n]])) { 
    cat(n, "has no default value\n") 
    } else { 
    cat(n, "has a default value:", formals(myfun)[[n]], "\n") 
    } 
} 

is.nameは私のベストのテストでありますしかし、私はそれが名前であり、それが空であることを両方とも見たいと思うでしょう(またはより良いが、より確かにmissingのようなより確定的なテストは機能の中で提供するでしょう)。

答えて

5

あなたは、それぞれの値が空であるかどうかをテストするために、空の文字列比較を行うことができます。

myfun <- function(a, b=1, ...) {} 
formals(myfun) 
for (n in names(formals(myfun))) { 
    if (formals(myfun)[[n]] == "") { 
    cat(n, "has no default value\n") 
    } else { 
    cat(n, "has a default value:", formals(myfun)[[n]], "\n") 
    } 
} 

Aにはデフォルト値
Bはデフォルト値がありませんしました:1
を...デフォルトはありません

:空の文字列の定義済みのデフォルトとして「」TREATたいという稀ではあるがPOSSIBLE CASEの更新された値

...
はデフォルト値にのために

EXTRA EDITを持っていない:1つの
cはデフォルト値があります。

myfun <- function(a, b=1, c="", ...) {} 
formals(myfun) 
for (n in names(formals(myfun))) { 
    if (!nzchar(formals(myfun)[[n]]) & is.name(formals(myfun)[[n]])) { 
    cat(n, "has no default value\n") 
    } else { 
    cat(n, "has a default value:", formals(myfun)[[n]], "\n") 
    } 
} 

aが
bはデフォルト値を持っているデフォルト値はありません完全:結果に空の引用符を実際に表示し、繰り返し呼び出す代わりにformals(myfun)を定義する:

にはデフォルト値
は bがデフォルト値を持っていない:1
cがデフォルト値を持っている:「」
...にはデフォルト値

+0

@jenesaisquoiを持っていない - それは間違いなくきれいですベースケースの場合。 @RichardScrivenが先に指摘したように、空の文字の既定値として定義されている '' 'を扱うケースをキャッチしません。 –

+0

「同義」がおそらく良いでしょう。 OPがこれをより大きな規模で使用している場合、このコンテキストでスピードの利点があるため、「nzchar」と一緒に行きました。 –

+0

@ jenesaisquoi:合意。 '=='はここではあまり良くありません。 –

関連する問題