Обещание уже в процессе оценки: рекурсивная ссылка на аргумент по умолчанию или более ранние проблемы? - PullRequest
121 голосов
/ 05 декабря 2010

Вот мой код R Функции определены как:

f <- function(x, T) {
  10 * sin(0.3 * x) * sin(1.3 * x ^ 2) + 0.001 * x ^ 3 + 0.2 * x + 80
}

g <- function(x, T, f=f) {
  exp(-f(x) / T)
}

test <- function(g=g, T=1) { 
  g(1, T)
}

Ошибка запуска:

> test ()
Ошибка в тесте ():
Обещание уже в процессе оценки: рекурсивная ссылка на аргумент по умолчанию или более ранние проблемы?

Если я подставлю определение f в определение g, то ошибка исчезнет.

Мне было интересно, что это за ошибка? Как исправить это, если не заменить определение f на определение g? Спасибо!


Обновление:

Спасибо! Два вопроса:

(1) если функция test далее принимает аргумент для f, вы добавите что-то вроде test <- function(g.=g, T=1, f..=f){ g.(1,T, f.=f..) }? Является ли хорошей и безопасной практикой добавление большего числа . ?

(2) если f является не функциональным аргументом, например, g <- function(x, T, f=f){ exp(-f*x/T) } и test <- function(g.=g, T=1, f=f){ g.(1,T, f=f.) }, использование одного и того же имени для формальных и фактических нефункциональных аргументов будет хорошей и безопасной практикой, или это может привести к какие-то потенциальные проблемы?

Ответы [ 2 ]

132 голосов
/ 05 декабря 2010

Формальные аргументы вида x=x вызывают это. Исключая два случая, когда они происходят, мы получаем:

f <- function(x, T) {
   10 * sin(0.3 * x) * sin(1.3 * x^2) + 0.001 * x^3 + 0.2 * x + 80 
}

g <- function(x, T, f. = f) {  ## 1. note f.
   exp(-f.(x)/T) 
}

test<- function(g. = g, T = 1) {  ## 2. note g.
   g.(1,T) 
}

test()
## [1] 8.560335e-37
2 голосов
/ 20 марта 2018

Если вы укажете контекст оценки аргумента, вы избежите проблемы с тем же именем:

f <- function(x) {
  10 * sin(0.3 * x) * sin(1.3 * x ^ 2) + 0.001 * x ^ 3 + 0.2 * x + 80
}
g <- function(x, t=1, f=parent.frame()$f) {
  exp(-f(x) / t)
}
test <- function(g=parent.frame()$g, t=1) { 
  g(1,t)
}
test()
[1] 8.560335e-37
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...