次の機能があるとします。
foo <- function(x, y = min(m)) {
m <- 1:10
x + y
}
を実行すると、期待どおりfoo(1)
、戻り値は2
です。ただし、遅延評価はデフォルトの引数に対してのみ機能するため、を実行foo(1, y = max(m))
して受け取ることはできません。11
引数を指定して遅延評価するにはどうすればよいですか?
次の機能があるとします。
foo <- function(x, y = min(m)) {
m <- 1:10
x + y
}
を実行すると、期待どおりfoo(1)
、戻り値は2
です。ただし、遅延評価はデフォルトの引数に対してのみ機能するため、を実行foo(1, y = max(m))
して受け取ることはできません。11
引数を指定して遅延評価するにはどうすればよいですか?
簡単な答えは、しようとすることはできないし、すべきではないということです。それは範囲を壊し、許可された場合に大混乱を引き起こす可能性があります. 問題について別の方法で考えることができるいくつかのオプションがあります。
最初に y を関数として渡します
foo<-function(x,y=min){
m<-1:10
x+y(m)
}
単純な関数が機能しない場合は、m をデフォルトの引数に移動できます。
foo<-function(x,y=min(m),m=1:10){
x+y(m)
}
これはおもちゃの例なので、些細すぎると思います。スコープを破ることを主張する場合は、明示的に評価される式として渡すことができます。
foo<-function(x,y=expression(min(m))){
m<-1:10
x+eval(y)
}
次に、別の関数から関数を返すオプションがあります。また、目的によっては、それもうまくいくかもしれません。
bar<-function(f)function(x,y=f(m)){
m<-1:10
x+y
}
foo.min<-bar(min)
foo.min(1) #2
foo.max<-bar(max)
foo.max(1) #10
しかし今、私たちはばかげたことに取り掛かり始めています。
私の解決策は、デフォルトの引数を変更することでした:
R> formals(foo)$y <- call("max", as.name("m"))
R> foo(1)
[1] 11