2017-04-20 4 views
6

次のコードRの適用機能が列と混乱しているのはなぜですか?

set.seed(0) 
m<-matrix(data=runif(6),nrow=2) 

apply(m,1,print) 
apply(m,1,function(x) print(x)) 

が与える:

[1] 0.8966972 0.3721239 0.9082078 
[1] 0.2655087 0.5728534 0.2016819 
      [,1]  [,2] 
[1,] 0.8966972 0.2655087 
[2,] 0.3721239 0.5728534 
[3,] 0.9082078 0.2016819 

したがって、一度印刷が列方向行方向の他の時間に実行されます。どうして?私の理解では、apply/printの両方の呼び出しはまったく同じことを行う必要があります。

答えて

6

ここに区別するために二つのものがあります。何printプリント、およびを返し何それは。

数値ベクトルの方法は、ベクトルの内容を画面に印刷します。これは、あなたが得た出力の最初の部分である:ここでは

[1] 0.8966972 0.3721239 0.9082078 
[1] 0.2655087 0.5728534 0.2016819 

、最初の行は、あなたの行列の行1のために印刷出力され、2行目は、行のために印刷出力される2

これに加えて、printメソッドは他の関数と同様に関数です。 は値を返します。返される値は、渡された値(デフォルトのメソッドの場合)です。この戻り値は一連のベクトルとしてapplyに返されます。

  [,1]  [,2] 
[1,] 0.8966972 0.2655087 
[2,] 0.3721239 0.5728534 
[3,] 0.9082078 0.2016819 

なぜベクトルは列ベクトルとして扱われる:applyは、次にマトリックスにこれらのベクターを連結しますか?これが何であるのですかapplyがあります。 ?applyから:

FUNへの各呼び出しは、長さnのベクトルを返す場合、N場合、寸法Cの配列(N、DIM(X)[MARGIN])リターンを適用> 1. nが1に等しい場合、MARGINの長さが1の場合はapplyが、次元の配列の場合はdim(X)[MARGIN]が返されます。

関連する問題