gpt4 book ai didi

python - R中的生成器函数

转载 作者:IT老高 更新时间:2023-10-28 20:41:08 27 4
gpt4 key购买 nike

R 中是否存在促进或提供“Python-like generators”实现的包或语言结构?

“类似 Python 的生成器”是指在调用之间保持状态的函数,在 R 语法中并从 Python 借用关键字 yield 将类似于:

iterable.fun <- function(){
yield list('a','b','c')
}

如果使用 yield 而不是 return,则连续调用该函数 3 次将给出:

> iterable.fun()
'a'
> iterable.fun()
'b'
> iterable.fun()
'c'

编辑:我遗漏了 Python 生成器与迭代器不同的一个方面。就是要迭代的整个对象列表不是建立在第一次调用之后然后迭代的,而是每个函数调用都会创建一个元素,该元素将为该调用返回。

最佳答案

iterators包有这个功能

library(iterators)
abc <- iter(c('a','b','c'))
nextElem(abc)
## [1] "a"
nextElem(abc)
## [1] "b"
nextElem(abc)
## [1] "c"

或者您可以使用 lambda.r<<- .本例修改自

http://cartesianfaith.wordpress.com/2013/01/05/infinite-generators-in-r/

博文中有更多示例

library(lambda.r)
seq.gen(start) %as% {
value <- start - 1L
function() {
value <<- value + 1L
return(value)
}
}



foo <- seq.gen(1)
foo()
## [1] 1
foo()
## [1] 2
foo()
## [1] 3

请注意,您也可以使用常规函数来执行此操作。

seq.gen <-function(start) {
value <- start - 1L
function() {
value <<- value + 1L
return(value)
}
}
foo2 <- seq.gen(1)
foo2()
## [1] 1
foo2()
## [1] 2
foo2()
## [1] 3

如果您想从一个可能的列表中进行选择,那么您或许可以使用 switch

seq.char(start) %as% {
value <- start - 1L
function() {
value <<- value + 1L
return(switch(value,'a','b','c'))
}
}

foo.char <- seq.char(1)
foo.char()
## [1] "a"
foo.char()
## [1] "b"
foo.char()
## [1] "c"

关于python - R中的生成器函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16028374/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com