将常量参数传递给 mapply() 函数时出错

Error in passing a constant argument to mapply() function

我创建了一个函数 运行 FastICA 在具有不同数量组件的数据集上,它 returns ICA 信号(S 矩阵)但格式很长。

compute_ICA <- function(r)
  
{
   res_ICA <- fastICA(df, r, alg.typ = "parallel", fun = "logcosh", alpha = 1,
             method = "R", row.norm = FALSE, maxit = 200,
             tol = 0.0000001, verbose = FALSE)
   df_long<-reshape2::melt(as.data.frame(res_ICA$S))
   return(df_long)
}

现在我想为一个特定的 r(组件数)重复此函数 100 次并跟踪迭代次数。 所以我尝试了这个:

iterate_ICA <- function(r,t)
{for (i in r)
{
  res<-mapply(compute_ICA, t, SIMPLIFY = FALSE)
  res_unzip<-do.call(rbind, res)
  res_unzip$iteration <- i
  return(res_unzip)
}
  }

但是当我尝试像这样应用 iterate_ICA() 函数时,我得到了这个错误:

res_zip<-mapply(iterate_ICA, 1:100, 3, SIMPLIFY = FALSE)
Error in dots[[1L]][[1L]] : object of type 'closure' is not subsettable

有谁知道这个函数有什么问题吗?

提前致谢!

我无法重现该错误,但是,我认为您误解了什么 mapply 会。

当您将 mapply 应用于函数 FUN 时,参数是 列表或向量(考虑 R 基本类型,如数字或字符始终是向量),函数 FUN 在所有参数的第一个元素上迭代调用,然后在第二个元素上迭代调用,等等。如果需要,参数将被回收。

例如:

fn <- function(num, let) {
  data.frame(num = num, let = let)
}

mapply(FUN = fn, 1:5, letters[1:5], SIMPLIFY = FALSE)

##> [[1]]
##>   num let
##> 1   1   a
##> 
##> [[2]]
##>   num let
##> 1   2   b
##> 
##> [[3]]
##>   num let
##> 1   3   c
##> 
##> [[4]]
##>   num let
##> 1   4   d
##> 
##> [[5]]
##>   num let
##> 1   5   e

为了符合您描述的预期行为,iterate_ICA 函数应如下所示:

iterate_ICA<-function(r,t) {
  res <-  compute_ICA(t)
  return(cbind(res, iteration = r))
}

然后使用 mapply:

对其进行迭代
res <- mapply(iterate_ICA, 1:100, 3, SIMPLIFY = FALSE)

最后,您合并所有重复:

res_unzip <- do.call(rbind, res)