3

私はRが初めてで、これが私のコードです:

f2 = function(n){
E = matrix(c(0),nrow = (n+1), ncol = (n+1));
k = -1;
for(j in 1:n+1){
 k = k + 1;
 l = 0;
 for(i in 1:n+1){
  if(k == 0){E[i,j] = 1;}
  if(k == 1){E[i,j] = 1 - (2*l)/n;}

  l = l + 1;
 }
}
print(E);

}

これは、n = 2 で印刷すると、次の「予期しない」結果になります。

> f2(2)
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    1    1
[3,]    0    1    0

しかし、私はこれを印刷したい:

> f2(2)
     [,1] [,2] [,3]
[1,]    1    1   0
[2,]    1    0   0
[3,]    1   -1   0

Javaでも試してみたので、私の論理は正しいと思いますが、期待どおりの結果が得られたので、ここで何が問題なのかわかりません。残念ながら、それは私が完成させたいより大きなプログラムの始まりなので、本当に面倒です.Rで行列を作成して操作するより良い方法を教えていただければ、非常に役に立ちます.

4

3 に答える 3

4

...しかし、より一般的に言えば、最終的にはこのスタイルの R コードに非常に不満を抱くようになります。他の言語 (Java?) の知識を使って始めるのは良いことですが、R コードを Java のように書くと、R が本当に嫌いになります。

これは、まったく同じことをより R 的な方法で行います。

> k <- matrix(0:2,3,3,byrow = TRUE)
> l <- matrix(0:2,3,3)
> ifelse(k == 0,1,ifelse(k == 1,1 - (2*l)/2,0))
     [,1] [,2] [,3]
[1,]    1    1    0
[2,]    1    0    0
[3,]    1   -1    0
于 2013-03-28T18:51:07.600 に答える
1

上記のコメントの視覚的な補助として:

> 1:5+1
[1] 2 3 4 5 6

> 1:(5+1)
[1] 1 2 3 4 5 6
> 
于 2013-03-28T18:47:23.480 に答える
1

@joran に続いて、任意の一般化n:

f3 <- function(n)
{
    E <- matrix(0, nrow = (n+1), ncol = (n+1))
    E[,1] <- 1
    E[,2] <- seq(from=1, to=-1, length.out=n+1)
    E
}

ベクトル化の威力を示すには、次のようにします。

> system.time(M <- f2(5000))
   user  system elapsed 
  41.37    0.20   41.78 
> system.time(N <- f3(5000))
   user  system elapsed 
   0.07    0.11    0.19

( f2 を括弧で固定し、 を削除した後print)

于 2013-03-28T19:10:01.503 に答える