R:调用时返回不同排列的闭包
我正在寻找一个闭包,它以整数向量R:调用时返回不同排列的闭包,r,functional-programming,closures,R,Functional Programming,Closures,我正在寻找一个闭包,它以整数向量x作为输入,并返回一个函数,该函数每次调用时都返回不同的x排列。我想象代码是这样的: R> perm_factory <- all_perms(1:2) R> perm_factory() [1] 1 2 R> perm_factory() [1] 2 1 R> perm_factory() NULL 下次试试排列,看看文档,好吗 --编辑-- 给你: sub <- function(n, r=n, v=1:n) {
x
作为输入,并返回一个函数,该函数每次调用时都返回不同的x
排列。我想象代码是这样的:
R> perm_factory <- all_perms(1:2)
R> perm_factory()
[1] 1 2
R> perm_factory()
[1] 2 1
R> perm_factory()
NULL
下次试试排列,看看文档,好吗
--编辑--
给你:
sub <- function(n, r=n, v=1:n) {
if (r == 1)
matrix(v, n, 1)
else if (n == 1)
matrix(v, 1, r)
else {
X <- NULL
for (i in 1:n)
X <- rbind(X,cbind(v[i], sub(n - 1, r - 1, v[-i])))
X <- X
}
}
all_perm <- function(n){
X <<- sub(n)
whichPerm <<- 0
nextPerm <-function(){
whichPerm <<- whichPerm+1
if(whichPerm<=nrow(X)){
return(X[whichPerm,])
}else{
return(NULL)
}
}
return(nextPerm)
}
nextPerm <- all_perm(5)
nextPerm()
sub对permutations
的调用返回一个矩阵-这不是我想要的,例如permutations(1e10,1e10)
将给您一个内存错误。这就是为什么我要求一个闭包,每个调用返回一个不同的排列。所以下次,看看这个问题,好吗?;)所以下次你的问题要具体点,好吗?:)你应该写下你迄今为止尝试过的东西。:)让我知道你是如何误解这个问题的,我会尝试相应地修改它。请随意。现在看看我的帖子。您有一个函数,每个调用返回一个不同的排列。就像你想的那样,对吧?它不适用于1e10
,但这不是您所讨论的内容,对吗?:)下次告诉我们你为什么需要这个(因为它需要处理大量数据)。@Mullefa,这是iterpc
的作者。实际上,当n=1000
时,使用getnext
是安全的,但是,使用getall
是不安全的。谢谢你把这个拿出来。我将在下一次更新中为大型n
发出适当的警告。
import itertools
perms = itertools.permutations(range(1, 1000000))
require(gtools)
permutations(3,3)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 1 3 2
[3,] 2 1 3
[4,] 2 3 1
[5,] 3 1 2
[6,] 3 2 1
permutations(2,2)
[,1] [,2]
[1,] 1 2
[2,] 2 1
sub <- function(n, r=n, v=1:n) {
if (r == 1)
matrix(v, n, 1)
else if (n == 1)
matrix(v, 1, r)
else {
X <- NULL
for (i in 1:n)
X <- rbind(X,cbind(v[i], sub(n - 1, r - 1, v[-i])))
X <- X
}
}
all_perm <- function(n){
X <<- sub(n)
whichPerm <<- 0
nextPerm <-function(){
whichPerm <<- whichPerm+1
if(whichPerm<=nrow(X)){
return(X[whichPerm,])
}else{
return(NULL)
}
}
return(nextPerm)
}
nextPerm <- all_perm(5)
nextPerm()
nextPerm <- all_perm(5)
nextPerm()
## [1] 1 2 3 4 5
nextPerm()
## [1] 1 2 3 5 4
nextPerm()
## [1] 1 2 4 3 5
nextPerm()
## [1] 1 2 4 5 3
require(iterpc)
I <- iterpc(5,ordered=TRUE)
getnext(I)
## [1] 1 2 3 4 5
getnext(I)
## [1] 1 2 3 5 4
getnext(I)
## [1] 1 2 4 3 5
getnext(I)
## [1] 1 2 4 5 3
getnext(I)
## [1] 1 2 5 3 4