関数を作成するコンストラクター関数があります。コンストラクターに対してローカルな「features」という名前の変数と、コンストラクターによって作成された関数に対してローカルな「features」という名前の別の変数があります。これらは、以下のコードで次のように区別されます。
1)## --> 'features' assignment 1 (see question)
features <- paramIN
2)## --> 'features' assignment 2 (see question)
features[!paramIN] <- p
3 つの観測;
1)features <- paramIN
返された関数の前に移動するfeatures[!paramIN] <- p
と、プログラムも機能します。paramIN
は返された関数内の自由変数であり、返された関数に対してfeatures
ローカルであり、サブセット化および代入される前にfeatures <- paramIN
宣言および初期化されるため、これは理にかなっています。features
2)返された関数features[!paramIN] <<- p
の外側の最初の宣言を使用して保持するとfeatures
、プログラムも機能し、さらに、features
返された関数が使用されると の最初のインスタンスが更新されます。この場合、返される関数に関する限り、features
との両方が自由変数です。返された関数の内部は、返された関数の外側で宣言されたものを参照してparamIN
いるようです。すべてが良いです。features
features
これが私の具体的な質問です:
3)しかしfeatures[!paramIN] <- p
、与えられたとおりに使用しても、完全に削除するfeatures <- paramIN
と、プログラムが見つからないため失敗しますfeatures
。最初の宣言 (返された関数の外側) はfeatures
、2 要素ベクトルとして確立する必要があるようです。しかし、「内側」features
は「外側」とは異なる変数features
です。features
返された関数に対してローカルであるため、返された関数の外側の宣言によってその存在と構造をどのように決定できますか?
## make.Function
## ============
## Constructor to make a function that accepts a vector of one or two elements
## Input argument:
##
## paramIN: 2-element vector to initialize and subset'features'
## There are two instances of 'features':
## One is local to make.Function(), and the second is local to the function defined inside make.Function()
##
## Acceptable values for paramIN:
## paramIn=c(<double>,FALSE): The constructed function accepts
## a scalar double and assigns it to 'features[1]'
## paramIn=c(FALSE,<double>): The constructed function accepts
## a scalar double and assigns it to 'features[2]'
## paramIn=c(FALSE,FALSE): The constructed function accepts
## a 2-element vector of doubles and assigns it to 'features' -OR -
## The constructed function accepts
## a scalar double and assigns it to both elements of 'features'
make.Function <- function(paramIN=c(FALSE,FALSE)) {
## 'paramIN', and 'features' are local variables in make.Function
## --> 'features' assignment 1 (see question)
features <- paramIN
## This function is returned by make.Function
function(p) {
## --> 'features' assignment 2 (see question)
features[!paramIN] <- p
x <- features[1]
y <- features[2]
## This is a simple function
x+2*y
}
}