2 つのスカラー値 の関数がありx_i
ますy_j
。x_i
n値、X および ny_j
値のベクトルがあります。
myfunction <- function(x,y) min(x,y)
X <- 1:3
Y <- 2:4
(i,j)
要素が によって与えられる$n$ by $n$ 行列に記入したいと思いmyfunction(x_i, y_j)
ます。でこれを行う方法はたくさんありますが、R
それらの相対的なパフォーマンスに興味があります。
たとえば、これは のタスクのように見えますがouter
、 にベクトルを渡すかスカラーを渡すかで混乱するようですmyfunction
。最初に考慮してください:
r
outer(X, Y, paste)
それぞれのペアを教えてください
[,1] [,2] [,3]
[1,] "1 2" "1 3" "1 4"
[2,] "2 2" "2 3" "2 4"
[3,] "3 2" "3 3" "3 4"
いいね。しかし
outer(X, Y, myfunction)
エラーをスローします:
Error: dims [product 9] do not match the length of object [1]
一方、次のような他の可能な関数は、スカラーで期待どおりに動作するようです。
myfunction <- function(x,y) exp((x-y)^2)
これは正常に動作します
outer(X, Y, myfunction)
[,1] [,2] [,3]
[1,] 2.718282 54.598150 8103.083928
[2,] 1.000000 2.718282 54.598150
[3,] 2.718282 1.000000 2.718282
いくつかの簡単な数値実験では、これは よりわずかに高速expand.grid
であり、関数呼び出しはよりコンパクトに見えますが、一部の関数が期待どおりに動作し、他の関数がそうでない理由を理解していないようです。
古典的なexpand.grid
解決策では、関数がベクトル引数で動作することも必要です。これは、私の例ではmin
; 同じ問題の別バージョン。関数への引数がベクトルではなくスカラーでなければならないという事実を強制する方法はありますか?