Mapply的稀疏性

时间:2019-08-16 16:21:27

标签: r sparse-matrix mapply

我尝试使用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)
}

是什么原因导致错误,我该如何纠正?

谢谢

1 个答案:

答案 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)))
  )