promessa já em avaliação: referência de argumento padrão recursiva ou problemas anteriores?




(2)

Argumentos formais da forma x=x causam isso. Eliminando as duas instâncias em que ocorrem, obtemos:

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

Aqui está o meu código R. As funções são definidas como:

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)
}

O erro em execução é:

teste ()
Erro no teste ():
promessa já em avaliação: referência de argumento padrão recursiva ou problemas anteriores?

Se eu substituir a definição de f em g , então o erro desaparece.

Eu queria saber qual foi o erro? Como corrigi-lo se não substituir a definição de f em g ? Obrigado!

Atualizar:

Obrigado! Duas questões:

(1) se o test função usar um argumento para f , você adicionará algo como test <- function(g.=g, T=1, f..=f){ g.(1,T, f.=f..) } ? Em casos com mais recursões, é uma prática boa e segura adicionar mais . ?

(2) se f é um argumento sem função, por exemplo, g <- function(x, T, f=f){ exp(-f*x/T) } e test <- function(g.=g, T=1, f=f){ g.(1,T, f=f.) } , Usar o mesmo nome para os argumentos não-funcionais formais e reais uma prática boa e segura ou pode causar algum problema em potencial?


Se você especificar o contexto de avaliação de argumentos, evita o problema do mesmo nome:

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



r  

r