46. クロージャは環境とひもづく
定義されたときの環境を「閉包」
> f <- function() {
+ print(environment());
+ function() {}
+ }
> g <- f()
<environment: 0x061d5cb4> # f の子環境
> environment(g) # ||
<environment: 0x061d5cb4> # g の環境
47. クロージャの環境の中身
> f <- function() {
+ x <- 3
+ function(a){ a * x } # 環境を閉包
+ }
> g <- f()
> g
function(a){ a * x } # x って何?
<environment: 0x06dbe0b8> # この中を見れば…
> ls.str(environment(g))
x : num 3 # g の環境では x <- 3
> g(2)
[1] 6 # つまり g は値を3倍する関数
52. 関数本体も差し替え!
> g
function(a){ a * x } # 掛け算する関数
<environment: 0x06dbe0b8>
> body(g) <- expression({ a + x })
> g
function (a)
{
a + x # 足し算する関数になった!
}
<environment: 0x06dbe0b8>
> g(1)
[1] 6 # 5を足す関数に変わった