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