0

関数で 2 つのシナリオを処理できるようにしたいとします。

somefun = function(x, y, method, ...) {
res = dowith(x, y)
res
}

somefun = function(z, method, ...) {
x = z$v1
y = z$v2
res = dowith(x, y)
res
}

somefunこの 2 つの状況の違いをどのように認識できますか?

4

2 に答える 2

1

これを自動的に行う方法はわかりませんが、このような状況に対処するときは、 を使用すると役立つことがありますswitch。基本的な例を次に示します。

somefun <- function(x, y = NULL, type = c("DF", "vecs"), method = NULL, ...) {
  switch(type,
         DF = sum(x[["v1"]], x[["v2"]]),
         vecs = sum(x, y),
         stop("'type' must be either 'DF' or 'vecs'"))
}

somefun(x = 10, y = 3, type="vecs")
# [1] 13
somefun(x = data.frame(v1 = 2, v2 = 4), type="DF")
# [1] 6
somefun(x = data.frame(v1 = 2, v2 = 4), type = "meh")
# Error in somefun(x = data.frame(v1 = 2, v2 = 4), type = "meh") : 
#   'type' must be either 'DF' or 'vecs'

type上記では、許容値が「DF」または「vecs」であり、オプションごとに異なる操作セットが定義されている引数をユーザーが入力する必要があると想定しています。

もちろん、さまざまなシナリオのセットをスクリプト化し、関数の開始時に条件チェックを使用して、期待どおりに動作することを確認します。たとえば、ほとんどの場合、人々が を入力すると予想される場合は、次のdata.frameようなことを行うことができます(またはそこに型ステートメントをif (is.null(y) & is.null(type)) temp <- "DF"挿入します)。try結局のところ、適切なデフォルト値のセットを予測できるかどうかにもかかってきます。

関数が複雑な場合は、switches に入るステップを別の関数に分けたいと思うかもしれません。これにより、コードがより読みやすく (そして再利用しやすく) なる可能性があります。

于 2013-10-13T10:54:30.950 に答える