R Замыкания не могут получить доступ к переменным внутри замыканий - PullRequest
0 голосов
/ 17 февраля 2019

Я перехожу от простого кода R к функциям R.Чтобы использовать замыкание R, я обернул 2 функции (аутентификация и загрузка), из которых (загрузка) зависит от необходимости ввода данных от аутентификации.

Насколько я понимаю, если я создаю замыкание, переменные внутризакрытие должно быть доступным для всей внутренней части закрытия.Если это так, то как функция howcome [downloadData] не может извлечь переменные из [authenticationKeys]?

В настоящее время я решаю проблему, располагая (аутентифицировать) и (загружать) в отдельных файлах 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 голосов
/ 17 февраля 2019

Вы всегда можете присвоить интересующие вас переменные другим средам за пределами замыкания, над которым вы работаете:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...