首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在没有全局范围的情况下将方法添加到R列表中

在没有全局范围的情况下将方法添加到R列表中
EN

Stack Overflow用户
提问于 2018-03-24 19:16:59
回答 1查看 56关注 0票数 0

我想使用purrr::walk()将对象推到flifo堆栈上。循环工作正常,但我的walk()实现不能。

代码语言:javascript
复制
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 使用列表如何保存对象和push()有关。在第三个函数中,除非使用全局赋值l3,否则不会修改<<-deck_purr的环境有什么窍门吗?

代码语言:javascript
复制
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))

顺便说一句,重栈包 (它没有实现LIFO堆栈)没有这个问题;我猜想这是因为它的R6内件处理堆栈的内部列表的作用域不同。

代码语言:javascript
复制
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中解决了这个问题。

EN

回答 1

Stack Overflow用户

发布于 2018-03-24 23:30:03

查克人包支持FIFO并使用purrr::walk()加载各个元素。pushback()方法正在下面有C指针周围移动这些元素。

代码语言:javascript
复制
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()循环那样,那么是否有一个更大的原始问题的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49468848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档