関数で 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 つの状況の違いをどのように認識できますか?
関数で 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 つの状況の違いをどのように認識できますか?
これを自動的に行う方法はわかりませんが、このような状況に対処するときは、 を使用すると役立つことがあります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
結局のところ、適切なデフォルト値のセットを予測できるかどうかにもかかってきます。
関数が複雑な場合は、switch
es に入るステップを別の関数に分けたいと思うかもしれません。これにより、コードがより読みやすく (そして再利用しやすく) なる可能性があります。