【问题标题】:Indexing a function call索引函数调用
【发布时间】:2015-03-27 13:47:30
【问题描述】:

我正在做一个欺骗游戏,我正在尝试用 R 来模拟。 我有一个长度为 n 的随机向量 A。我想要一个函数。例如,提取使得用户第一次使用 extract() 时,他得到 A[1],第二次他得到 A[2] 直到 A[n]。我知道如果我可以在提取函数中为 i 提供一个参数会容易得多,但我不想给人留下我们正在记录用户操作的印象。

我的尝试

j<-1

extract<-function(){
  B<-numeric(n)
  x<-sample(c(1:6),1)
  B[i]<-j
  j<-j+1
  return(x)
}

然后调用B获取结果向量 但它不起作用

【问题讨论】:

  • 你需要创建一个“副作用”。将索引保存在某处(例如,在.GlobalEnv 或其他环境中),并让您的函数在每次调用extract 时检索并更新该索引。您可以为此使用assign()
  • 非常感谢。我花了一天时间才弄清楚。终于成功了
  • 顺便问一下,每当调用相关函数时,我如何更新索引?

标签: r function call


【解决方案1】:

您可以创建一个环境来记录索引变量i 和值向量A。然后,每次调用extract 时,您都可以拉取当前索引i,在环境中更新该索引,并返回A 的适当值。此过程称为“副作用”,因为调用extract() 会执行修改工作区中的值而不是函数返回值的操作。这在 R 中也是一种不太常见的方法,因为该函数对工作区中未显式传递给 extract 的对象执行操作。

e <- new.env()
e$i <- 1
e$A <- 1:15

extract <- function() {
    x <- e$A[e$i]
    e$i <<- e$i + 1
    return(x)
}

extract()
# [1] 1
extract()
# [1] 2
extract()
# [1] 3
extract()
# [1] 4
extract()
# [1] 5

一旦到达A 向量的末尾,您可能需要引入if 语句来更改extract 的行为。

【讨论】:

  • 非常感谢。减轻我学习 python 的负担 :)
猜你喜欢
  • 1970-01-01
  • 2012-06-01
  • 2021-07-08
  • 2017-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
相关资源
最近更新 更多