R中有两个主要索引的列表

R中有两个主要索引的列表,r,list,function,loops,indices,R,List,Function,Loops,Indices,我有一个带有三个参数(一个矩阵和两个参数)的函数,返回一个列表。我想为每个a和b值存储函数值(这里是矩阵列表),以便从其索引中提取特定值 下面是一个简单的例子。(不工作,但解释情况) 我怎样才能做到这一点 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
b
值存储函数值(这里是矩阵列表),以便从其索引中提取特定值

下面是一个简单的例子。(不工作,但解释情况

我怎样才能做到这一点

   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)

像这样的怎么样?这将返回
ff
返回对象的
列表;每个
列表
条目对应一个特定的
a
b
组合

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

a
b
的长度如何不同?或者您想为
a
b
值的所有组合计算
ff1
?我想为每个
a[I]
b[j]
计算
ff1
,并将它们组合到一个列表
res[I,j]
。结果是
res
对象。当我调用
res[I,j]
(或类似的东西)时,它应该返回
ff(X,a[j],b[j])
。谢谢您的回复。但我也有类似的代码。我感兴趣的主要部分是
call
阶段。我需要从它的索引中调用一个特定的结果。例如,
res[i,j]
res[[i,j]]
或类似的东西应该返回
ff[X,a[i],b[j]
。因此,我可以在我拥有的更大的代码中使用它。在上面的示例中,从
[[1]]
[[12]]
的列表中只有一个主索引。。其形式应为
1,1;1,2; 1,3; 1,4; 2,1; 2,2; 2,3….
@mert我建议重新考虑您的下游代码设计。将结果存储在
列表中
是一种非常方便且符合R的方法,因为它允许使用
*apply
系列中的方法进一步处理
res
。这里的关键是
expand.grid(a,b)
,它在
data.frame
中存储所有
a
b
组合。每一行对应一个特定的
a
b
组合,对于每一行,我们计算
ff(X,a,b)
,并将其输出存储在
列表中。换句话说,
res
的条目对应于
expand.grid(a,b)
的行。这将允许您选择特定的
a
b
组合。@mert“在上面的示例中,从
[[1]]
[[12]]
的列表中只有一个主索引……”我不知道您的意思
ff
返回您设计的
列表
;我们计算不同组合的
ff(X,a,b)
b
。因此,
res
的输出应该是
list
list
。这正是我的
res
的结构。对不起,我无法解释我自己。我的想法就像矩阵(或数据框架)一样,包含列表元素。也就是说,
res
应该是一个对象,它有两个维度,包含列表元素。但是,如果不可能,我将尝试按照您的建议将
res
expand.grid
的输出进行匹配。谢谢
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]>