R 嵌套在lappy中应用,以循环矩阵列表的列

R 嵌套在lappy中应用,以循环矩阵列表的列,r,hydrogof,R,Hydrogof,我有一个矩阵列表,我试图对每个矩阵的每一列应用一个函数。我认为,这样做的自然方式是将apply嵌套在lapply中,但当我这样做时,它会给我一个错误: library(hydroGOF) # for the mse function # Create a vector for comparison A <- rnorm(10) # Create a list of matrices to be looped over B <- rnorm(10 * 5 * 3) list.el

我有一个矩阵列表,我试图对每个矩阵的每一列应用一个函数。我认为,这样做的自然方式是将
apply
嵌套在
lapply
中,但当我这样做时,它会给我一个错误:

library(hydroGOF)  # for the mse function

# Create a vector for comparison
A <- rnorm(10)

# Create a list of matrices to be looped over
B <- rnorm(10 * 5 * 3)
list.element.number <- rep(1:3, 50)
B.list <- split(B, list.element.number)
B.list <- lapply(B.list, matrix, ncol = 5, nrow = 10)  # A 3 element list of 10 x 5 matrices

# Wrapper function for mse
my.mse <- function(sim) {
  mse(sim, A)
}

# I'm trying to loop through each column of B.list and compare it to A
lapply(B.list, apply, MARGIN = 2, FUN = my.mse)
# Error in FUN(X[[1L]], ...) : 
#   unused arguments (function (X, MARGIN, FUN, ...) 
#   {
#     FUN <- match.fun(FUN)
#     dl <- length(dim(X))
#     if (!dl) stop("dim(X) must have a positive length")
#     if (is.object(X)) X <- if (dl == 2) as.matrix(X) else as.array(X)
#     d <- dim(X)
#     dn <- dimnames(X)
#     ds <- seq_len(dl)
#     if (is.character(MARGIN)) {
#       if (is.null(dnn <- names(dn))) stop("'X' must have named dimnames")
#       MARGIN <- match(MARGIN, dnn)
#       if (anyNA(MARGIN)) stop("not all elements of 'MARGIN' are names of dimensions")
#     }
#     s.call <- ds[-MARGIN]
#     s.ans <- ds[MARGIN]
#     d.call <- d[-MARGIN]
#     d.ans <- d[MARGIN]
#     dn.call <- dn[-MARGIN]
#     dn.ans <- dn[MARGIN]
#     d2 <- prod(d.ans)
#     if (d2 == 0) {
#       newX <- array(vector(typeof(X), 1), dim = c(prod(d.call), 1))
#       ans <- FUN(if (length(d.call) < 2) newX[, 1] else array(newX[, 1], d.call, dn.call), ...)
#       return(if (is.null(ans)) ans else if (length(d.ans) < 2) ans[1][-1] else array(ans, d.ans, dn.a
library(hydroGOF)#用于mse函数
#创建用于比较的向量

A
FUN=my.mse
正在劫持您尝试应用
的行为。我想你想要:

lapply(B.list, function(x) apply(x, 2, my.mse))
不能在同一调用中同时为
lappy
apply
指定
FUN
(除非按照Konrad的建议使用位置匹配)。发生的情况是,您的呼叫正在匹配,如下所示:

lapply(B.list, FUN=my.mse, ...=list(apply, MARGIN=2))
在您的第一次迭代中,这将导致尝试评估:

my.mse(B.list[[1]], apply, MARGIN=2)

而不是您期望的
应用(B.list[[1]],2,my.mse)
。由于
my.mse
只接受一个参数,因此会出现“unused argument”错误。如果仔细观察,“未使用的参数”是
apply
函数的主体。

位置参数应该可以工作,不过:
lappy(B.list,apply,2,my.mse)
@KonradRudolph,好主意,不过显然你必须非常小心。