我試圖編寫一個函數,該函數接受(除其他之外)參數,該參數可能是vector
,matrix
或一個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
),M1
,M2
,D1
,或者D2
作爲參數,我會打電話給myArg
。在這個功能裏面,我想做一些類似的事情:
sapply(MyT, function(t) { apply(D2[S > t, ], 2, sum) })
上面的這一行很好。問題是,我需要讓通用的,如:
sapply(MyT, function(t) { apply(myArg[S > t, ], 2, sum) })
然而,該代碼會失敗,例如,如果myArg
是L1
或L2
。在這種特殊情況下,因爲我試圖非法地將一個矢量子集,錯誤信息將會顯示爲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
。
好奇,如果任何人都可以,爲什麼當我使用M2
爲myArg
我會使用'is.vector','is.matrix'和'is.data.frame'來測試。你也可以考慮數組。你也可以爲該功能製作單獨的方法,這可能是正確的方法。 – alistaire