R Hackerな人ヘルプ【関数内関数とmapplyのネスト】

関数内関数とmapplyの付近でなんだかよく分からない挙動になっている。まず、以下のような関数を用意。

hoge <- function(x1,x2){
  return(function(y){
    cat(x1,x2,fill=TRUE)
    x1*x2*y})
}

内側のmapplyで関数を生成、外側のmapplyでそれを評価している。

> mapply(function(f){f(1)},mapply(hoge,1:3,3:1))
3 1
3 1
3 1
[1] 3 3 3

なんだかよく分からないが、全部同じになってしまう。これを回避するためには

> hoge <- function(x1,x2){
+   x1 <- x1
+   x2 <- x2
+   return(function(y){
+     cat(x1,x2,fill=TRUE)
+     x1*x2*y})
+ }
> mapply(function(f){f(1)},mapply(hoge,1:3,3:1))
1 3
2 2
3 1
[1] 3 4 3

などというよく分からないことをしないといけない。こんなの書きたくないわけである。うーん。。。