r

promesa que ya se está evaluando: ¿argumento recurrente recursivo de referencia o problemas anteriores?



(2)

Aquí está mi código R Las funciones se definen 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) }

El error de ejecución es:

> prueba ()
Error en la prueba ():
promesa que ya se está evaluando: ¿argumento recurrente recursivo de referencia o problemas anteriores?

Si sustituyo la definición de f por la de g , entonces el error desaparece.

Me preguntaba cuál fue el error. ¿Cómo corregirlo si no sustituye la definición de f en la de g ? ¡Gracias!

Actualizar:

¡Gracias! Dos preguntas:

(1) si la test función toma un argumento para f , ¿agregará algo como test <- function(g.=g, T=1, f..=f){ g.(1,T, f.=f..) } ? En casos con más recurrencias, ¿es una buena y segura práctica agregar más ? ?

(2) si f es un argumento sin función, por ejemplo g <- function(x, T, f=f){ exp(-f*x/T) } y test <- function(g.=g, T=1, f=f){ g.(1,T, f=f.) } , ¿Usará el mismo nombre tanto para los argumentos no funcionales formales como para los reales una práctica buena y segura o puede causar algún problema potencial?


El mismo problema, el nombre del valor predeterminado, en una función más simple:

f1=function(df1,tr=tr){ print(tail(tr)) } df1=data.frame() f1(df1) Error in tail(tr) : promise already under evaluation: recursive default argument reference or earlier problems?

Una solución es simplemente asignar tr explícitamente:

f1(df1,tr) nu_pregao cd_papel true_range pc_true_range mdTr13 sdTr13 mdTr21 sdTr21 70315 1781 AGRO3 0.25 0.019 0.01492308 0.005880215 0.01628571 0.006709269 70316 1781 AELP3 0.47 0.157 0.04223077 0.041219239 0.06061905 0.055112137 70317 1781 ADHM3 0.05 0.026 0.03469231 0.014912996 0.02976190 0.014542712 70318 1781 ABEV3 0.52 0.022 0.02176923 0.006610016 0.02204762 0.008639885 70319 1781 ABCB4 0.69 0.037 0.02838462 0.010444604 0.02585714 0.009456668 70320 1781 AALR3 0.71 0.042 0.02700000 0.010885771 0.02466667 0.010184956

Otra solución es simplemente cambiar el nombre del parámetro:

f2=function(df1,tr1=tr){ print(tail(tr1)) } f2(df1) nu_pregao cd_papel true_range pc_true_range mdTr13 sdTr13 mdTr21 sdTr21 70315 1781 AGRO3 0.25 0.019 0.01492308 0.005880215 0.01628571 0.006709269 70316 1781 AELP3 0.47 0.157 0.04223077 0.041219239 0.06061905 0.055112137 70317 1781 ADHM3 0.05 0.026 0.03469231 0.014912996 0.02976190 0.014542712 70318 1781 ABEV3 0.52 0.022 0.02176923 0.006610016 0.02204762 0.008639885 70319 1781 ABCB4 0.69 0.037 0.02838462 0.010444604 0.02585714 0.009456668 70320 1781 AALR3 0.71 0.042 0.02700000 0.010885771 0.02466667 0.010184956

¿Por qué R no permite el mismo nombre para el valor predeterminado?


Los argumentos formales de la forma x=x causan esto. Al eliminar las dos instancias en las que ocurren, obtenemos:

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