R闭包不能访问闭包中的变量

问题描述 投票:1回答:1

我正在从简单的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()
r closures
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.