不久之前,我想要一种更简单的方法来创建具有命名尺寸的多维数组。
我最终编写了一个对我来说非常好用的功能,但我担心它可能有点像黑客并且可能有更好的方法。所以在将这个传递给同事之前,我在这里寻求建议。
我想要做的是能够创建多维数组,其中维度的名称由向量的名称指定,元素的名称由该向量的内容指定。 e.g。
sex <- c("F","M")
name2 <- c("a","b","c")
这可以写出来。
dimnames1 <- list( sex=sex, name2=name2 )
dim1 <- sapply(dimnames1, function(x) length(x))
a <- array(0,dim=dim1, dimnames=dimnames1)
a
name2
sex a b c
F 0 0 0
M 0 0 0
但我希望能够保持这种紧凑:
我写了这个函数来启用它。
array_named <- function( ...)
{
listArgs <- as.list(match.call()[-1])
#works only if args are specified by actual ranges not by a varname
#dimnames1 <- lapply(listArgs,eval)
#works, I'm not sure why n=3
dimnames1 <- lapply(listArgs,function(x){eval.parent(x, n=3)})
#setting dimensions of array from dimnames1
dim1 <- sapply(dimnames1, function(x) length(x))
#creating array and filling with fill value
a <- array(0, dim=dim1, dimnames=dimnames1)
return(a)
}
这允许按名称传递矢量:
array_named( sex=sex, name2=name2 )
name2
sex a b c
F 0 0 0
M 0 0 0
直接例如
array_named( a=c(1,2), b=c('x','y') )
b
a x y
1 0 0
2 0 0
这有问题是否有更明智的做法?