Во втором примере есть три проблемы.
Во-первых, 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