在接受vector,matrix或data.frame作为参数的函数中使用apply

时间:2016-12-12 03:52:01

标签: r

我试图编写一个接受(除其他事项外)可能是vectormatrixdata.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),M1M2D1D2作为论据,我称之为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时,我仍然获得myArg

我感到困惑,因为dim(M2)会产生[1] 15 2

如果有人能够在我使用M2作为myArg

时发现错误的原因,那么我很好奇

1 个答案:

答案 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])