小编典典

承诺已经在评估中:递归默认参数引用或早期问题?

all

这是我的 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() test()
中的错误:
promise 已经在评估中:递归默认参数引用或早期问题?

如果我将 的定义替换为fg,那么错误就会消失。

我想知道错误是什么?如果不替换 中的定义,如何f更正g?谢谢!


更新:

谢谢!两个问题:

(1)如果函数test进一步接受参数f,你会添加类似的东西test <- function(g.=g, T=1, f..=f){ g.(1,T, f.=f..) }吗?在有更多递归的情况下,添加更多 .?

(2) iff是一个非函数参数,例如g <- function(x, T, f=f){ exp(-f*x/T) }and test <- function(g.=g, T=1, f=f){ g.(1,T, f=f.) },对形式和实际的非函数参数使用相同的名称会是一种良好且安全的做法,还是可能会导致一些潜在的麻烦?


阅读 125

收藏
2022-08-16

共1个答案

小编典典

形式的形式论据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
2022-08-16