首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mapply的Sparsematrix

mapply的Sparsematrix
EN

Stack Overflow用户
提问于 2019-08-17 00:21:27
回答 1查看 52关注 0票数 2

我正在尝试使用mapply,因为我已经使用过forloop,但它需要很长时间才能运行,所以我尝试使用mapply在r中计算一个大型的sparsematrix数据集,但我遇到了这个错误

代码语言:javascript
复制
Error in (function (t)  : 
  unused arguments (dots[[2]][[1]], dots[[3]][[1]])

这是一个较小的数据集

代码语言:javascript
复制
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))
代码语言:javascript
复制
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)
}

是什么导致了这个错误?我该如何纠正它?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2019-08-17 01:11:25

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),即它将三个参数传递给一个只需要一个参数(t)的lambda函数。结果抛出了一个错误。它将类似于调用:

代码语言:javascript
复制
myTriple <- function(x) 3*x
myTriple(1, 2, 3)

我不确定第一个mapply调用后的其他行是什么意思,因此要解决这个问题,需要让function(t)接受(并使用)额外的参数,将它们移到function(t)定义中,或者将它们移出调用。下面是您的mapply调用的格式化,以使它更明显地发生了什么。mapply的所有参数都有相同的缩进:

代码语言:javascript
复制
  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)))
  )
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57528034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档