这是我的 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()
Error in test() :
promise already under evaluation: recursive default argument reference or earlier problems?
如果我替换 f
的定义在 g
中,然后错误就消失了。
我想知道错误是什么?如果不替换f
的定义如何纠正它在 g
中?谢谢!
更新:
谢谢!两个问题:
(1) if 函数 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.) }
,对形式和实际的非功能参数使用相同的名称是一种良好且安全的做法还是可能会导致一些潜在的麻烦?
最佳答案
x=x
形式的形式参数会导致这种情况。消除它们发生的两个实例,我们得到以下结果。 (您不能在函数定义的形式参数中使用 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
关于r - promise 已在评估中 : recursive default argument reference or earlier problems?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4357101/