R闭包无法访问闭包内的变量

时间:2019-02-17 20:13:55

标签: r closures

我正在从普通的R代码转到R函数。为了使用R闭包,我包装了2个函数(身份验证和下载),其中的(下载)具有需要身份验证输入的依赖性。

我的理解是,如果我创建一个闭包,则闭包内部的变量对于整个闭包内部都应该可以访问。如果是这种情况,howcome函数[downloadData]无法从[authenticationKeys]中获取变量?

目前,我正在通过在单独的R文件中进行(身份验证)和(下载)并将其采购到main.R中来解决该问题。问题是虽然我随后将变量的结果放入了全局范围,但似乎不建议这样做。此外,通过获取文件,我无法利用函数参数,也无法利用仅在需要时调用部分代码来利用函数编程的好处。

runAll <- function() {

    # Authentication
    authenticate <- function() {
      auhtenticationKeys <- list (
        "key1" = 1,
        "key2" = 2,
        "key3" = 3
      )
    }

    authenticate()

    # Download 
    downloadData <- function() {

      # Access authentication keys:
      auhtenticationKeys$key1
      auhtenticationKeys$key2
      auhtenticationKeys$key3

      myData <- list (
        "open"  = 10,
        "high"  = 11,
        "low"   = 12,
        "close" = 13
      )
    }

    downloadData()

}

runAll()

1 个答案:

答案 0 :(得分:0)

您始终可以将您感兴趣的变量分配给正在处理的闭包之外的其他环境:

runAll <- function() {

  # Authentication
  authenticate <- function() {
    auhtenticationKeys <- list (
      "key1" = 1,
      "key2" = 2,
      "key3" = 3
    )
   assign("auhtenticationKeys",auhtenticationKeys, envir=parent.frame())
  }

  authenticate()
  # Download 
  downloadData <- function() {

    # Access authentication keys:
    auhtenticationKeys$key1
    auhtenticationKeys$key2
    auhtenticationKeys$key3

    myData <- list (
      "open"  = 10,
      "high"  = 11,
      "low"   = 12,
      "close" = 13
    )

  }

  downloadData()

}


runAll()

通过此行:

assign("auhtenticationKeys",auhtenticationKeys, envir=parent.frame()),您的密钥可在下载数据中找到,并且可以运行代码。 您可以在此处查看更多信息:http://adv-r.had.co.nz/Environments.html#function-envs