これは非常に単純で一般的な質問ですが、まだ議論されていません。何も見逃していないことを願っています。
関数のいくつかのレイヤーを持つ大きなプログラムの設計を開始しています。他のプログラミング言語には明確な戦略がありますが、「引数」を持つ関数の「パラメーター」を処理する方法について、R で標準的な解決策を見つけることができません。 "。「パラメーター」と「引数」は実際には関数の入力と同じですが、概念的な違いがあります。前者はより高いレベルに設定され、頻繁に変更されることはありませんが、後者は関数が処理する実際のデータです。
この簡単な例を考えてみましょう:
対象のサブ関数 SF() は、「WORKER」によって異なる引数を使用して何度も照会されますが、「上」に設定されている同じパラメーターを使用します。もちろん、同じ質問が複数のレイヤーを持つより複雑なケースにも当てはまります。
これに対処する方法は 2 つあります。 1. すべてを継承しますが、関数呼び出しに無数の引数が含まれるか、これらすべての引数を囲む構造体になります。b. R は関数を呼び出すために引数のコピーを作成するため、あまり効率的ではない可能性があります。2. パラメータを変更するたびに関数を動的に評価し、それらを関数定義に「ハードワイヤ」します。しかし、特にクリーンな方法でそれを行う方法がわかりません。
これはどれも本当に好感が持てるとは思えないので、その点について意見はありますか?R のいくつかの環境機能を使用できるのではないでしょうか? :-)
ありがとう!
EDIT : 一部の人にとっては、コードはグラフよりも優れているため、メソッド「1.」を使用してすべての引数を渡すダミーの例を次に示します。多くのレイヤーとサブ関数がある場合、すべてのパラメーターを中間レイヤー (ここでは WORKER()) に渡すのは良くないようです。(コードとパフォーマンスの観点から)
F <- function(){
param <- getParam()
result <- WORKER(param)
return(result)
}
getParam <- function(){
return('O')
}
WORKER <- function(param) {
X <- LETTERS[1:20]
interm.result <- sapply(X,SF,param) # The use of sapply here negates maybe the performance issue?
return(which(interm.result=='SO'))
}
SF <- function(x,param) {
paste0(x,param)
}
EDIT 2 : 上記の例の単純さは、私の問題を見ている親切な人々の一部を誤解させるため、離散勾配降下を使用したより具体的な図を次に示します。繰り返しますが、すべてを同じ大きな関数で記述できるようにシンプルに保ちましたが、それは私が実際の問題でやりたいことではありません。
gradientDescent <- function(initialPoint= 0.5, type = 'sin', iter_max = 100){
point <- initialPoint
iter <- 1
E <- 3
deltaError <- 1
eprev <- 0
while (abs(deltaError) > 10^(-2) | iter < iter_max) {
v_points <- point + -100:100 / 1000
E <- sapply(v_points, computeError, type)
point <- v_points[which.min(E)]
ef <- min(E)
deltaError <- ef - eprev
eprev <- ef
iter <- iter+1
}
print(point)
return(point)
}
computeError <- function(point, type) {
if (type == 'sin') {
e <- sin(point)
} else if (type == 'cos') {
e <- cos(point)
}
}
サブ関数が評価されるたびに、サブ関数の「タイプ」パラメーターを渡すのは最適ではないことがわかりました。@hadley によって Closures にもたらされた参照と @Greg の説明は、私が必要とするソリューションへの良い道筋のようです。