查找所有排列并在R中调用结果

  • 本文关键字:调用 结果 排列 查找 r
  • 更新时间 :
  • 英文 :


需要编写一个函数 permn(m,n,FUN),该函数 CC_1找到尺寸n的M的所有排列,并返回通过在每个排列上调用fun返回的值的矢量,但努力努力弄清楚如何调用趣味每个人。

由于我们不在乎效率,因此我决定首先使用permutations()函数计算所有排列,然后将排列向量传递到乐趣中。但是,这仅在娱乐不需要访问向量的特定索引的情况下起作用。

permn <- function(m, n, FUN=NULL) {
  result <- c()
  if (length(m) == 1) {
    p <- permutations(length(1:m),n,1:m)
  } else {
    p <- permutations(length(m),n,m)
  }
  result <- FUN(p)
  return(result)
}

如果我执行以下操作,则将fun应用于矩阵中的每个元素,然后获得正确的输出,即12x2矩阵。但是,传递诸如first <- function(z) z[1]之类的函数,该函数应该返回每个排列的第一个元素,仅返回一个元素。例如,打电话 permn(7:10,2,first)应该从看起来像

的矩阵中返回[1] 7 7 7 8 8 8 9 9 9 10 10 10

[1,] 7 8

[2,] 7 9

[3,] 7 10

[4,] 8 7

...

,但返回7。我该如何做到这一点,以便将乐趣应用于向量中的每个排列?

您可以使用 purrr::map或base r sapply

first <- function(z) purrr::map_dbl(z[,1], ~.x[1])
# alternate
# first <- sapply(z[,1], function(x) x[1])
permn(7:10, 2, first)
#  7  7  7  8  8  8  9  9  9 10 10 10

update 每个OP注释
如果您需要保持first() AS-IS,则只需在permn内与map包装,例如:

first <- function(z) z[1]
permn <- function(m, n, FUN=NULL) {
  result <- c()
  if (length(m) == 1) {
    p <- permutations(length(1:m),n,1:m)
  } else {
    p <- permutations(length(m),n,m)
  }
  result <- purrr::map_dbl(p[,1], FUN)
  return(result)
}
permn(7:10, 2, first)
#  7  7  7  8  8  8  9  9  9 10 10 10

最新更新