2016-12-12 11 views
0

vectormatrix、または次のいずれかの引数を受け入れる関数を作成しようとしています。 a data.frameベクトル、行列、またはdata.frameを引数として受け入れる関数でapplyを使用する

set.seed(101) 
MyT <- seq(0, 1, 0.1) 
S <- sample(seq(0, 1, 0.01), 15, replace = T) 
L1 <- sample(c(0,1), 15, replace = T) 
L2 <- sample(c(0,1), 15, replace = T) 
M1 <- as.matrix(L1) 
M2 <- as.matrix(L1, L2) 
D1 <- data.frame(L1) 
D2 <- data.frame(L1, L2) 

私はmyArgと呼ぶことにします引数としてL1(またはL2)、M1M2D1、またはD2を受け入れるのに十分総称である関数を記述したいと思います。関数の中で、私は次のようなことをしたい:

sapply(MyT, function(t) { apply(D2[S > t, ], 2, sum) }) 

上記の行はうまくいきます。 myArgL1L2であれば、例えば、

sapply(MyT, function(t) { apply(myArg[S > t, ], 2, sum) }) 

しかし、このコードは失敗します:問題は、私は同じように、それは一般的な作成する必要があるということです。この特定のケースでは、ベクトルを不法にサブセット化しようとしているため、エラーメッセージはincorrect number of dimensionsとなります。サブセットの問題を修正すると、をベクターに使用できないため、dim(X) must have a positive lengthの問題が発生します。などなど...

だから、私は次の操作を行いますしようとしているに上陸しました:

sapply(MyT, function(t) { 
    if (length(dim(myArg)) == 0) sum(myArg[S > t]) # for vector 
    else if (dim(myArg)[2] == 1) sum(myArg[S > t, ]) # for single-column matrix or data.frame 
    else sapply(myArg[S > t, ], 2, sum) # for multi-column matrix or data.frame 
}) 

が、私はこれが動作するように期待が、私は使用したとき、私はまだ Error in apply(myArg[S > t, ], 2, sum) : dim(X) must have a positive lengthを取得しています M2myArgとする。

dim(M2)[1] 15 2であるため、私は混乱しています。誰もが、私はRは、オブジェクトフレームワークを持っているM2myArg

+0

私は 'is.vector'、' is.matrix'、 'is.data.frame'を使ってテストします。同様に配列を考慮する必要があるかもしれません。関数を別々のメソッドにすることもできます。これはおそらく正しい方法です。 – alistaire

答えて

5

として使用する場合、私はこのエラーを取得する理由に光を当てることができれば

好奇心。実際には3つあります(R6をカウントすると4つ、プロトを数えれば5つ)。だから、なぜそれらを利用しないのですか?

+0

フィードバックいただきありがとうございます!私はこれを試したが、依然として「適用エラー(x [S> t、]、2、myFunc.default):dim(X)は正の長さでなければならない」というメッセージを受け取りました。 (編集:私が行った呼び出しは 'myFunc.matrix(M2、S、MyT)') – user451151

+0

これはD1では機能しません。 – user451151

関連する問題