将常量参数传递给 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)
我创建了一个函数 运行 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)