如何从循环中的函数列表中提取参数

How to extract a parameter from a list of functions in a loop

我有一个大数据集,我想同时执行多个函数并为每个函数提取一个参数。

测试数据集:

testdf <- data.frame(vy = rnorm(60), vx = rnorm(60) , gvar = rep(c("a","b"), each=30))

我首先定义了一个函数列表:

require(fBasics)
normfuns <- list(jarqueberaTest=jarqueberaTest, shapiroTest=shapiroTest, lillieTest=lillieTest)

然后是通过分组变量执行测试的函数

mynormtest <- function(d) {
  norm_test <- res_reg <- list()
  for (i in c("a","b")){
    res_reg[[i]] <- residuals(lm(vy~vx, data=d[d$gvar==i,]))
    norm_test[[i]] <- lapply(normfuns, function(f) f(res_reg[[i]]))  
  }
  return(norm_test) 
}

mynormtest(testdf)

我获得了每个分组变量的测试摘要列表。 但是,我只对获取参数 "STATISTIC" 感兴趣,但我没有找到如何提取它的方法。

您可以使用

在各种测试的输出中获取存储为 "STATISTIC" 的值
res_list <- mynormtest(testdf)
res_list$a$shapiroTest@test@statistic
res_list$a$jarqueberaTest@test@statistic
res_list$a$lillieTest@test@statistic

相应地对于集合 b:

res_list$b$shapiroTest@test$statistic
res_list$b$jarqueberaTest@test$statistic
res_listb$lillieTest@test$statistic

希望对您有所帮助。

关于您的函数 fgetparam 我认为这是一个很好的起点。这是我的一些小修改的建议:

getparams2 <- function(myp) {
  m <- matrix(NA, nrow=length(myp), ncol=3)
  for (i in (1:length(myp))){
    m[i,] <- sapply(1:3,function(x) myp[[i]][[x]]@test$statistic)}
  return(m)
}

这个函数代表了一个次要的概括,因为它允许任意数量的观察,而在你的情况下,它被固定为两种情况,a 和 b。代码当然可以进一步缩短,但它也可能变得更加神秘。我认为,在开发代码时,一方面要在有效性和紧凑性与另一方面的可读性或易懂性之间保持一定的折衷是有帮助的。

编辑

作为@akrun 和@Roland 的,函数getparams2() 可以用更优雅和更短的形式编写。一种可能是

getparams2 <- function(myp) {
    matrix(unname(rapply(myp, function(x) x@test$statistic)),ncol=3)}

另一个不错的选择是

getparams2 <- function(myp){t(sapply(myp, sapply, function(x) x@test$statistic))}