访问父函数中的变量

时间:2018-03-23 19:07:30

标签: r closures global-variables s4

我正在编写一个在大型PDF中查找文本的脚本,并且我已经写出了裸骨脚本。我正在尝试重构我的代码以在函数中封装主while循环,因此我可以使用PDF列表在其上运行sapply()。我在主循环中调用的一些函数需要来自该主循环的值:这是我的代码的精简版本:

pdfParse <- function() {
  N <- sample(1:50, 1)*2
  n = N/2; i = 0   

  while (i <= N) {
    what <- whatP(n)
    i = i + length(what)
    if !length(what) {break}
    else {n <- N/2 - i}
  }
  n
}

res <- sample(0:1, N)
r = 1
whatP <- function(t) {
  r = r*2
  if (t%%3) {
    if (t%%5) {
      return(res[(n/r):n])
    } else {
      whatP((rev(t)[1]):(rev(t)[1] + r))
  } else {return(rep(NaN, 2))}
}

所以我的问题是,如何访问我在其调用的函数中n函数中定义的变量pdfParse?即使有可能,我也希望避免将其指定为全局变量。我已经阅读了一些关闭的内容,但我不确定这是否是适用的解决方案。

编辑:为了澄清,whatP(n)n作为其初始参数开始,但它是递归的,因此根据某些条件是否得到满足,它可能最终会在不具有'{'}的向量上运行甚至包括n。但是我仍然希望返回依赖于n

中定义的原始pdfParse的内容

1 个答案:

答案 0 :(得分:0)

最简单的(也可能是最安全的,假设您的res函数是递归的)是n {em} {} whatP参数

whatP <- function(t,n) {
...
}

然后使用两个参数而不是一个参数从pdfParse调用它。

如果出于某种原因你不想这样做,那么你有两个选择

(a)您实际上可以只使用n,就好像它在范围内一样。 R的查找变量的规则与C(++)非常不同。按顺序,R搜索

  • 当前功能的环境
  • 其父级环境(调用它的函数)
  • 其父母的父母的环境等等
  • 全球环境
  • 已加载包的环境,其顺序与search()中显示的顺序相同。

由于您的函数是在定义n的函数内调用的,因此它会在第二个(或第三个,给定它是递归的)项目符号下找到适当的值。

(b)您可以使用get,其中pos的合适(负值)对应父母。 (或者,使用sys.frame)。这里不推荐使用递归函数是很棘手的,但在其他情况下可能很有用(并且它会绕过你可能在另一个更近的范围内重新定义的任何n