スコープ(変数検索ルール)は、関数の実行中に変数を使用する場合、呼び出し時の環境ではなく、変数が定義された環境からレイヤーごとに検索されます。
####関数linear_outputの中に子関数linearを定義します
x <- 0
y <- 10
linear_output <- function(x){
y <- 100
linear <- function(){
x * 2 + y
}
linear()
}
linear_output(1)
実行結果
102
関数内で変数の値を定義されない場合、親環境までに変数の値を探します。関数linearは
xを定義されないので、関数linear_outputをもらう値「x <-1,y <- 100」により実行します。
※ グローバル部署の変数を無視されました。
####関数linear_outputと関数linearは別々に定義します
x <- 0
y <- 10
linear_output <- function(x){
y <- 100
linear(x)
}
linear <- function(x){
x * 2 + y
}
linear_output(1)
実行結果
12
linear_outputは関数linearの親関数ではないので、linearのyはグローバル環境に至るまだyの値を調べました。関数linear_outputをもらう値「x <-1, y <- 10」により実行します。
####【豆知識】
※ちなみに、推薦ではないですが、↓のような書き方があることを認識して頂くように、こちらで紹介しております。
【<-】 を【 <<-】 にすると関数内での変数操作がグローバルに保存されます
x <- 0
y <- 10
linear_output <- function(x){
y <<- 100
linear(x)
}
linear <- function(x){
x * 2 + y
}
linear_output(1)
実行結果
102
linear_output関数内のyはグローバル変数として残ります