1

2 つのスカラー値 の関数がありx_iますy_jx_in値、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; 同じ問題の別バージョン。関数への引数がベクトルではなくスカラーでなければならないという事実を強制する方法はありますか?

4

1 に答える 1

3

outer に渡される関数はベクトル化する必要があります。

ソースコードから

   FUN <- match.fun(FUN)
        Y <- rep(Y, rep.int(length(X), length(Y)))
        if (length(X)) 
            X <- rep(X, times = ceiling(length(Y)/length(X)))
        robj <- FUN(X, Y, ...)
        dim(robj) <- c(dX, dY)

min単一の数値を返しますpmin

より一般的には、Vectorize を使用できます。

于 2012-10-26T06:09:48.357 に答える