需要编写一个函数 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