将2D data.frame
或matrix
自动转换为1D向量也很好,在编写泛型函数时会出现一些问题。例如,尝试使用foo
之类的命令过滤输入foo[,1:3]
的某些列适用于data.frame
或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
的{{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
}
此方法还维护原始对象的类。