首页 > 解决方案 > R闭包不能访问闭包内的变量

问题描述

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

我的理解是,如果我创建一个闭包,闭包内的变量应该可以被整个闭包内部访问。如果是这种情况,为什么函数 [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()

标签: rclosures

解决方案


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

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


推荐阅读