2016-12-12 29 views
0

我試圖編寫一個函數,該函數接受(除其他之外)參數,該參數可能是vectormatrix或一個data.frame使用適用於接受vector,matrix或data.frame作爲參數的函數

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) 

我想編寫一個函數,是通用的,足以接受L1(或L2),M1M2D1,或者D2作爲參數,我會打電話給myArg。在這個功能裏面,我想做一些類似的事情:

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

上面的這一行很好。問題是,我需要讓通用的,如:

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

然而,該代碼會失敗,例如,如果myArgL1L2。在這種特殊情況下,因爲我試圖非法地將一個矢量子集,錯誤信息將會顯示爲incorrect number of dimensions。如果我解決了子集問題,那麼我遇到了dim(X) must have a positive length問題,因爲我不能在矢量上使用apply。等等等等......

所以,我降落在努力做到以下幾點:

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當我使用M2 as myArg

我很困惑,因爲dim(M2)收益率[1] 15 2

好奇,如果任何人都可以,爲什麼當我使用M2myArg

+0

我會使用'is.vector','is.matrix'和'is.data.frame'來測試。你也可以考慮數組。你也可以爲該功能製作單獨的方法,這可能是正確的方法。 – alistaire

回答

5

R有一個目標的結構,我得到這個錯誤線索。其中有三個,事實上(如果你算R6的話,有四個,如果算上原點的話,有五個)。那麼爲什麼不使用它們呢?

myFunc <- function(x, ...) 
UseMethod("myFunc") 

# don't use apply() on data frames unless you know what you're doing 
myFunc.data.frame <- function(x, S, t, ...) 
sapply(x[S > t, ], myFunc.default) 

myFunc.matrix <- function(x, S, t, ...) 
apply(x[S > t, ], 2, myFunc.default) 

myFunc.default <- function(x, S=1, t=0, ...) 
sum(x[S > t]) 
+0

感謝您的反饋!我嘗試了這個,仍然得到了錯誤apply(x [S> t,],2,myFunc.default):dim(X)必須有一個正長度的消息。 (編輯:我的電話是'myFunc.matrix(M2,S,MyT)') – user451151

+0

這也不適用於D1。 – user451151

相關問題