我试图编写一个接受(除其他事项外)可能是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
时,我仍然获得myArg
。
我感到困惑,因为dim(M2)
会产生[1] 15 2
。
如果有人能够在我使用M2
作为myArg
答案 0 :(得分: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])