Как заставить вспомогательную функцию наследовать переменные от основной функции - PullRequest
2 голосов
/ 19 марта 2020

Я хотел бы установить функцию bar(), которая опирается на вспомогательную функцию foo(). Я изо всех сил пытаюсь найти самый чистый способ настройки определений переменных, поэтому мне не нужно повторять определения как в foo(), так и в bar().

. Кажется, это должно работать, но это не так:

# helper function
foo <- function() {
 (a + b)/(c - d)
}

# main function
bar <- function(a, b, c, d) {
 z <- foo()
 z * 3
}

bar(a = 1, b = 2, c = 3, d =  4)

Работает, но чувствует себя повторяющимся в определениях функций:

foo <- function(a, b, c, d) {
  (a + b)/(c - d)
}


# main function
bar <- function(a, b, c, d) {
  z <- foo(a, b, c, d)
  z * 3
}

bar(a = 1, b = 2, c = 3, d = 4)

Работает, чтобы сначала назначить переменные глобально, но не идеально:

a <- 1
b <- 2
c <- 3
d <- 4 

foo <- function() {
  (a + b)/(c - d)
}

# main function
bar <- function(a, b, c, d) {
  z <- foo()
  z * 3
}

bar(a = a, b = b, c = c, d =  d)

Есть ли способ заставить вспомогательную функцию распознавать переменные, определенные в основной функции?

1 Ответ

2 голосов
/ 20 марта 2020

Если вы определите foo в bar, то foo() будет искать a, b, c и d в среде, в которой оно определено.

bar <- function(a, b, c, d) {

  foo <- function() {
    (a + b)/(c - d)
  }

  z <- foo()
  z * 3
}

Результат

bar(a = 1, b = 2, c = 3, d =  4)
# -9

Подробнее об этом можно прочитать здесь: http://adv-r.had.co.nz/Functions.html#lexical -scoping

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

...