Композиция функций в R: пример из замыканий - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь создать минималистский пример композиции функций, начиная с Пример Уикхема для замыканий

Это работает:

power <- function(exponent, base_f) {
  base_f <-   function(x) {
    x ^ exponent
  }  
  base_f
  }

square <- power(exponent = 3)
square(x = 2)

Но это не так:

base_f <-   function(x) {   
  x ^ exponent 
}  

power <- function(exponent, base_f) {     
  res1 <- base_f(x)     
  return(res1)   
}


square <- power(exponent = 3) 
square(x = 2)

Почему?

Я ищу решение, которое разделяет обе функции.

1 Ответ

0 голосов
/ 09 февраля 2019

Во втором примере есть три проблемы.

Во-первых, power относится к x, который не определен.Вы хотите res <- base_f, а не res <- base_f(x)

Во-вторых, обратите внимание, что R использует лексическую область видимости.Это означает, что когда на функцию ссылаются в функции, и эта переменная также не определена ранее в этой функции, то она смотрит на лексическое окружение функции, то есть смотрит на среду, в которой функция была определена -- не среда, из которой была вызвана функция.

Во втором примере base_f не будет смотреть на power для exponent, но будет смотреть на глобальную среду, поскольку это лексическая среда, гдеbase_f был определен.Сделайте копию base_f и задайте для ее среды текущее окружение в пределах power.

В-третьих, при вызове power в конце кода отсутствует второй аргумент.

Внесение этих изменений работает.Измененные или новые строки помечены ##.

base_f <-   function(x) {   
  x ^ exponent 
}  

power <- function(exponent, base_f) {   
  environment(base_f) <- environment()  ##
  res1 <- base_f ##
  return(res1)   
}

square <- power(exponent = 3, base_f) ##
square(x = 2)
## [1] 8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...