我想使用purrr::walk()
将对象推送到flifo stack。循环正常,但我的walk()实现没有。
requireNamespace("flifo")
cards <- letters[1:5]
deck_loop <- flifo::fifo()
deck_purrr <- flifo::fifo()
# Looping works correctly
for( card in cards ) {
flifo::push(deck_loop, card)
}
message("Deck size: ", as.integer(flifo::size(deck_loop) / 96), " cards")
# Returns: "Deck size: 5 cards"
# This version of calling purrr::walk() doesn't work.
purrr::walk(cards, function(card) flifo::push(deck_purrr, card))
message("Deck size: ", as.integer(flifo::size(deck_purrr) / 96), " cards")
# Returns: "Deck size: 0 cards"
我认为这个问题与fifo uses a list如何保存对象和push()
有关。在第三个函数中,除非使用全局赋值l3
,否则不会修改<<-
。 deck_purr
的环境是否存在一些技巧?
l3 <- list()
fx3 <- function(a) {
# l3[[length(l3) + 1L]] <- a # Won't work b/c it's not a global assignment
l3[[length(l3) + 1L]] <<- a
}
purrr::walk(11:15, function( x ) fx3(x))
顺便说一句,rstack package(没有实现LIFO堆栈)没有这个问题;我假设它是因为R6 internals以不同方式处理堆栈的范围internal list。
deck_rstack <- rstack::stack$new()
purrr::walk(cards, function(card) deck_rstack$push(card))
message("Deck size: ", deck_rstack$size(), " cards")
编辑2018年7月:flifo开发人员在https://github.com/paulponcet/flifo/issues/1中解决了这个问题。
答案 0 :(得分:0)
dequer包支持FIFO并使用purrr::walk()
加载单个元素。 pushback()
方法正在with C pointers underneath移动这些元素。
deck_dequer <- dequer::queue()
purrr::walk(cards, function(card) dequer::pushback(deck_dequer, card))
message("Deck size: ", length(deck_dequer), " cards")
虽然这解决了FIFO结构的特定情况,但如果purrr::walk()
可以像顶级for()
那样解决较大的原始问题,我仍然很好奇{1}}循环堆栈的元素。