列出 R 中的两个主要索引

List with two main indices in R

我有一个带有三个参数(一个矩阵和两个参数)的函数返回一个列表。我想为每个 ab 值存储函数值(此处为矩阵列表),以便我可以从其索引中提取特定值。

下面是一个最小的例子。 (不工作但解释情况

我怎样才能做到这一点?

   ff <- function(X,a,b){
      ff1 <- a*X+b
      ff2 <- (a+b)*colSums(X)
      list(ff1,ff2)
    }

    X <- matrix(c(10,15,20,25),2)
    a <- c(1,2,3)
    b <- c(4,5,6,7)

    res <-  # ??????

    for(i in 1:length(a)){
      for(j in 1:length(b)){
        res[??????] <- ff(X,a[i],b[j])  # WRONG
      }
    }

    # WANT TO GET, for example
    res[2,3] # = ff(X,a=2,b=6)

这样的事情怎么样?这 return 是 listff return 个对象;每个 list 条目对应一个特定的 ab 组合。

res <- apply(as.data.frame(expand.grid(a, b)), 1, function(w)
    ff(X, w[1], w[2]))
str(res)
#List of 12
# $ :List of 2
#  ..$ : num [1:2, 1:2] 14 19 24 29
#  ..$ : num [1:2] 125 225
# $ :List of 2
#  ..$ : num [1:2, 1:2] 24 34 44 54
#  ..$ : num [1:2] 150 270
# $ :List of 2
#  ..$ : num [1:2, 1:2] 34 49 64 79
#  ..$ : num [1:2] 175 315
# $ :List of 2
#  ..$ : num [1:2, 1:2] 15 20 25 30
#  ..$ : num [1:2] 150 270
# $ :List of 2
#  ..$ : num [1:2, 1:2] 25 35 45 55
#  ..$ : num [1:2] 175 315
# $ :List of 2
#  ..$ : num [1:2, 1:2] 35 50 65 80
#  ..$ : num [1:2] 200 360
# $ :List of 2
#  ..$ : num [1:2, 1:2] 16 21 26 31
#  ..$ : num [1:2] 175 315
# $ :List of 2
#  ..$ : num [1:2, 1:2] 26 36 46 56
#  ..$ : num [1:2] 200 360
# $ :List of 2
#  ..$ : num [1:2, 1:2] 36 51 66 81
#  ..$ : num [1:2] 225 405
# $ :List of 2
#  ..$ : num [1:2, 1:2] 17 22 27 32
#  ..$ : num [1:2] 200 360
# $ :List of 2
#  ..$ : num [1:2, 1:2] 27 37 47 57
#  ..$ : num [1:2] 225 405
# $ :List of 2
#  ..$ : num [1:2, 1:2] 37 52 67 82
#  ..$ : num [1:2] 250 450

更新

可以ff的输出存储在tibble中,其中列对应于a,行对应于b值。然后,每个元素都是一个 list,它是特定 ab 对的 ff 的 return 对象。 IMO,使用起来更加笨拙(而且不整洁),但是你开始吧:

library(tidyverse)
expand.grid(a, b) %>%
    rowwise() %>%
    mutate(res = list(ff(X, Var1, Var2))) %>%
    ungroup() %>%
    spread(Var1, res)
## A tibble: 4 x 4
#   Var2 `1`        `2`        `3`
#  <dbl> <list>     <list>     <list>
#1    4. <list [2]> <list [2]> <list [2]>
#2    5. <list [2]> <list [2]> <list [2]>
#3    6. <list [2]> <list [2]> <list [2]>
#4    7. <list [2]> <list [2]> <list [2]>