具体例: x : (1, 2, 3, 4) などというベクトルがあったとき, 行列の要素 A[i, j] が (x[i]+x[j])/2 つまり x[i] と x[j] の平均値となるようにしたい プログラム例: > x <- 1:4 > outer(x, x, mean) としたのでは以下のようになってしまい,期待する結果は得られない。 [,1] [,2] [,3] [,4] [1,] 2.5 2.5 2.5 2.5 [2,] 2.5 2.5 2.5 2.5 [3,] 2.5 2.5 2.5 2.5 [4,] 2.5 2.5 2.5 2.5 R 2.0.0 以降では, Error in outer(x, x, mean) : dim<- : dims [product 16] do not match the length of object [1] というエラーメッセージが出るようになった > outer(x, x, "+")/2 とすれば,期待通りの結果になるが,もっとスマート(?)にしたい。 [,1] [,2] [,3] [,4] [1,] 1.0 1.5 2.0 2.5 [2,] 1.5 2.0 2.5 3.0 [3,] 2.0 2.5 3.0 3.5 [4,] 2.5 3.0 3.5 4.0 前もって > mean2 <- function(x, y) (x+y)/2 という二変数関数を定義しておいて,第三引数にその関数名を書いて > outer(x, x, mean2) という風にすればよい。 [,1] [,2] [,3] [,4] [1,] 1.0 1.5 2.0 2.5 [2,] 1.5 2.0 2.5 3.0 [3,] 2.0 2.5 3.0 3.5 [4,] 2.5 3.0 3.5 4.0 > outer(x, x, function(a, b) (a+b)/2) のように,第三引数に,直接関数定義を書いても良い。 [,1] [,2] [,3] [,4] [1,] 1.0 1.5 2.0 2.5 [2,] 1.5 2.0 2.5 3.0 [3,] 2.0 2.5 3.0 3.5 [4,] 2.5 3.0 3.5 4.0