我在R中有一个数组,由这样的函数创建:
A <- array(data=NA, dim=c(2,4,4), dimnames=list(c("x","y"),NULL,NULL))
Run Code Online (Sandbox Code Playgroud)
我想沿着一个维度选择,所以对于上面的例子,我会:
A["x",,]
dim(A["x",,]) #[1] 4 4
Run Code Online (Sandbox Code Playgroud)
有没有办法概括,如果我事先不知道我的数组可能有多少维度(除了我要选择的命名的维度)?我想编写一个函数来获取可能格式化为A的输入,或者:
B <- c(1,2)
names(B) <- c("x", "y")
C <- matrix(1, 2, 2, dimnames=list(c("x","y"),NULL))
Run Code Online (Sandbox Code Playgroud)
一般背景是我正在研究ODE模型,因此对于deSolve的ODE函数,它必须采用具有当前状态的单个命名向量.对于其他一些函数,比如计算相位平面/方向场,使用更高维数组来应用微分方程更为实际,我希望避免使用相同函数的多个副本,只需使用不同的函数我想要选择的维度之后的逗号数量.
在本答案中,alist()建议使用a作为创建包含空元素的列表的简单方法.用于此的用例将是构建适合于对[被安排的via 的调用的列表do.call().例如:
x <- matrix(1:6, ncol = 2)
do.call(`[`, alist(x, , 2)) ## extract column 2 of x
[1] 4 5 6
Run Code Online (Sandbox Code Playgroud)
提示答案的特定问题alist()需要根据对象动态设置空参数shortdim.
如果有人知道有多少维度可以做到
al <- alist( , , ) ## 3 arguments for a 2-d object
al[[1]] <- x
shortdim <- 1
al[[shortdim + 1]] <- 1:2 ## elements 1 & 2 of dim shortdim, plus all other dims
do.call(`[`, al)
> do.call(`[`, al)
[,1] [,2] …Run Code Online (Sandbox Code Playgroud)