1. ホーム
  2. r

[解決済み] プロミスはすでに評価中:再帰的なデフォルトの引数参照、または以前の問題?

2022-04-22 11:01:13

質問

以下は私の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()でエラーが発生しました。

約束はすでに評価中:再帰的なデフォルトの引数の参照、または以前の問題?

の定義に置き換えると f の中に g であれば、エラーは解消されます。

このエラーは何なのでしょうか?の定義を置き換えない場合、どのように修正すればよいのでしょうか? f の中に g ? ありがとうございます。


更新しました。

ありがとうございました。質問が2つあります。

(1) もし関数 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 が原因となります。 これが発生する2つのインスタンスを削除すると、次のようになります。

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