2010-12-05 7 views
93

Aquí está mi código R. Las funciones se definen como:promesa que ya se está evaluando: ¿argumento recurrente recursivo de referencia o problemas anteriores?

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 correr es:

> test()
error en la prueba():
promesa ya se encuentra bajo evaluación: recursiva referencia argumento por defecto o problemas anteriores ?

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

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


Actualización:

Gracias! Dos preguntas:

(1) si la función test además 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 recursiones, es una práctica buena y segura agregar más .?

(2) si f es un argumento que no es 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.) }, se utiliza el mismo nombre para ambos argumentos no funcionales formales y reales una práctica buena y segura o puede causar algunos problemas potenciales?

Respuesta

101

Argumentos formales del formulario x=x causan esto. Eliminando las dos instancias donde 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 
+1

¡Gracias! Dos preguntas (1) si función * prueba * además toma un argumento para * f *, ¿agregará algo como * prueba <- función (g. = G, T = 1, f ... = f) {g. (1 , T, f. = F ..)} *? En los casos con más recursiones, ¿es una buena y segura práctica agregar más *. *? (2) si * f * es un argumento sin función, por ejemplo * g <- función (x, T, f = f) {exp (-f * x/T)} * y * prueba <- función (g . = g, T = 1, f = f) {g. (1, T, f = f.)} *, usará el mismo nombre para los argumentos no funcionales tanto formales como reales una práctica buena y segura o puede causar algunos problemas potenciales? – Tim

+10

¿Alguna otra solución? Estoy pasando algunos argumentos en el fondo de la cadena de funciones (alrededor de 5 niveles), y esta solución puede convertirse en '..... engorroso'. :) –

+0

¿Qué pasa si no puedo cambiar el nombre de un argumento, por ejemplo, cuando la función en cuestión es una función del sistema como 'get'? – sds

Cuestiones relacionadas