0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Rのスコープに注意すべきところ

Last updated at Posted at 2022-02-03

スコープ(変数検索ルール)は、関数の実行中に変数を使用する場合、呼び出し時の環境ではなく、変数が定義された環境からレイヤーごとに検索されます。

####関数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はグローバル変数として残ります

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?