我尝试使用mapply是因为我使用过forloop,但是运行时间很长,所以我尝试使用mapply在r中计算大型的sparsematrix数据集,但遇到了这个错误
Error in (function (t) :
unused arguments (dots[[2]][[1]], dots[[3]][[1]])
这是一个较小的数据集
fam <- structure(list(ID = c(1L, 2L, 3L, 4L, 6L, 5L, 7L), dad = c(0L,
0L, 1L, 1L, 1L, 3L, 5L), mum = c(0L, 0L, 0L, 2L, 4L, 4L, 6L),
GEN = c(1L, 1L, 2L, 2L, 3L, 3L, 4L)), class = "data.frame", row.names = c(NA,
-7L))
library(Matrix)
hom = function(fam) {
t1 <- min(which.max(fam$dad > 0), which.max(fam$mum > 0))
t2 <- max(fam[["ID"]])
A<-Matrix(0, nrow=t2,ncol=t2, sparse=TRUE)
diag(A) <- 2-0.5^(fam[["GEN"]]-1)
A<-mapply(t=t1:t2, function(t) A[[t,t]]<- sum(2-0.5^(fam[[t,"GEN"]]- 1)+0.5^(fam[t,"GEN"])*A[fam[t,"dad"],fam[t,"mum"]]),
mapply(j=1:length(t-1), function(j)
A[t,j]<-0.5*sum(c(A[j,fam[t,"dad"]],A[j,fam[t,"mum"]]))
), A <- as.numeric(tril(A)+t(tril(A, -1))))
return(A)
}
是什么原因导致错误,我该如何纠正?
谢谢
答案 0 :(得分:1)
mapply的功能签名是
mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE, USE.NAMES = TRUE)
结果,第一个未命名的参数变为FUN
(在您的情况下为function(t)...
)。您命名的t参数(t = t=t_start:t_end
)传递给它。所有其他未命名的参数也将传递给FUN
。在您的代码中,mapply
也正在传递
mapply(j=1:length(t-1), function(j) A[t,j]<-0.5*sum(c(A[j,fam[t,"dad"]],A[j,fam[t,"mum"]])))
和
A <- as.numeric(tril(A)+t(tril(A, -1))
作为function(t)
的参数,也就是说,它会将三个参数传递给仅需要1个参数(t
)的lambda函数。结果引发了错误。类似于调用:
myTriple <- function(x) 3*x
myTriple(1, 2, 3)
我不确定在第一次mapply
调用之后您对其他行的意图是什么,因此要解决此问题,您需要使function(t)
接受(并使用)其他参数,然后移动它们进入function(t)
定义,或将其移出通话。这是您的mapply
调用的格式,它使发生的事情更加明显。 mapply
的所有参数都具有相同的缩进:
A <- mapply(t=t_start:t_end,
function(t) A[[t,t]]<- sum(2-0.5^(fam[[t,"GEN"]]- 1) + 0.5^(fam[t,"GEN"])*A[fam[t,"dad"],
fam[t,"mum"]]
),
mapply(j=1:length(t-1),
function(j) A[t,j]<-0.5*sum(c(A[j,fam[t,"dad"]],A[j,fam[t,"mum"]]))),
A <- as.numeric(tril(A)+t(tril(A, -1)))
)