1

2Ddata.framematrix1D 向量的自动转换也很好,但在编写通用函数时会产生一些问题。例如,尝试foo使用命令过滤输入的某些列,例如foo[,1:3]适用于 a data.frameor matrix

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但是,如果我们在其主体中启用其他过滤器bar(),可能会将其再次转换为向量,那么问题会复杂得多。然后对于每个过滤,我们应该检查并执行相同的操作以确保我们拥有的仍然是一张表。

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

问题是:如何简单地将适用于表的函数转换为通用函数,如果输入恰好是向量,它仍然有效?

4

1 回答 1

1

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

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

foo <- function(dat,rows) { 

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

... # continue with function
}

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

于 2012-10-23T23:14:38.217 回答