4

パラメータが関数で定義されていることを確認する一般的な方法を探しています。この3つのアイデアを思いつきました。それを行う適切な方法はどれですか?

残念ながら、3番目のものは機能していません。関数内での代用()の動作が異なり、適切に使用する方法がわかりませんでした。

file.names <- list(
                   cov.value <- "cov.rds",
                   plot.name <- "plot.pdf"
)

test1 <- function(file.names){
  is.save <- !missing(file.names)
}

test2 <- function(file.names = NULL) {
  is.save <- !is.null(file.names)
}

test3 <- function(file.names = NULL) {
  is.save <- exists(as.character(substitute(file.names)))
}
4

2 に答える 2

3

個人的には、デフォルト値を使用した 2 番目のアプローチの方が使いやすく、理解しやすいと思います。(そして、3番目のアプローチは本当に悪いです)

...特に、引数を渡す必要があるラッパー関数を作成している場合。「欠落している」値を渡す方法は明らかではありません!

wraptest1 <- function(n) {
    file.names <- if (n > 0) sample(LETTERS, n) 
      else alist(a=)[[1]] # Hacky way of assigning 'missing'-value
    print(test1(file.names))
}
wraptest1(2) # TRUE
wraptest1(0) # FALSE

wraptest2 <- function(n) {
    file.names <- if (n > 0) sample(LETTERS, n) 
      else NULL # Much easier to read & understand
    print(test2(file.names))
}
wraptest2(2) # TRUE
wraptest2(0) # FALSE

[確かに、欠落している値を渡すことを回避する方法は他にもありますが、ポイントは、デフォルト値を使用する方がはるかに簡単だということです...]

考慮すべきデフォルト値は次のとおりNULLですNAnumeric(0)''

于 2012-05-02T16:59:26.327 に答える
2

一般に、経験豊富なコーダーのコードを調べることをお勧めします---そしてR自体にはRソースにたくさんの例があります。

私はあなたの最初と2番目の例の両方が使用されているのを見てきました。最初のものはかなり慣用的です。私は個人的には今でも習慣の力で2番目をより頻繁に使用しています。私が見つけた3番目のものはあまりにも曖昧です。

于 2012-05-02T16:03:44.800 に答える