我正在尝试使用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)
}是什么导致了这个错误?我该如何纠正它?
谢谢
发布于 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函数。结果抛出了一个错误。它将类似于调用:
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)))
)https://stackoverflow.com/questions/57528034
复制相似问题