为输入恰好是向量时工作的表编写泛型函数

时间:2012-10-23 21:59:12

标签: r function vector matrix dataframe

将2D data.framematrix自动转换为1D向量也很好,在编写泛型函数时会出现一些问题。例如,尝试使用foo之类的命令过滤输入foo[,1:3]的某些列适用于data.framematrix

foo=matrix(1:9,nrow=3)
bar = function(x) print(x[,1])
bar(foo) # [1] 1 2 3

但是考虑一下我们首先想要过滤foo的某些行,并且只发生一行:

bar(foo[1,]) # Error in x[, 1] : incorrect number of dimensions

这个问题可以通过一个简单的技巧来解决:

bar = function(x) {
    if (is.null(dim(x))) x = t(data.frame(x))
    print(x[,1])
}

但如果我们在x的{​​{1}}中有其他过滤器可能会将其再次转换为向量,那么问题就会复杂得多。然后,对于每个过滤,我们应该检查并做同样的事情,以确保我们拥有的仍然是一个表。

其他问题是:如果矩阵的过滤部分只是一行/列,则缺少行名和/或列名。需要进一步操作以将过滤后的部分重新组织为矩阵,检索原始行/列名称并将它们分配给结果矩阵。

问题是:如何简单地转换一个适用于表格的函数,如果输入恰好是向量,它仍然可以工作?

1 个答案:

答案 0 :(得分:1)

在处理可能是vector或data.frame的数据时,我遇到了类似的问题。

通常,我只是在函数中创建一个子集函数。

foo <- function(dat,rows) { 

if(is.data.frame(dat) || is.matrix(dat)) { 
dat <- dat[rows,] 
} else {
dat <- dat[rows]

... # continue with function
}

此方法还维护原始对象的类。