development

이미 평가중인 약속 : 재귀적인 기본 인수 참조 또는 이전 문제?

big-blog 2020. 7. 3. 17:59
반응형

이미 평가중인 약속 : 재귀적인 기본 인수 참조 또는 이전 문제?


여기 내 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 of test () :
이미 평가중인 약속 : 재귀적인 기본 인수 참조 또는 이전 문제?

f에서 의 정의를 대체하면 g오류가 사라집니다.

오류가 무엇인지 궁금했습니다. 정의의 대체하지 않을 경우 어떻게를 해결하기 위해 f의에 g? 감사!


최신 정보:

감사! 두 가지 질문 :

(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이 이것을 유발합니다. 발생하는 두 인스턴스를 제거하면 다음과 같은 이점이 있습니다.

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

인수 평가 컨텍스트를 지정하면 동일한 이름의 문제점을 피할 수 있습니다.

f <- function(x) {
  10 * sin(0.3 * x) * sin(1.3 * x ^ 2) + 0.001 * x ^ 3 + 0.2 * x + 80
}
g <- function(x, t=1, f=parent.frame()$f) {
  exp(-f(x) / t)
}
test <- function(g=parent.frame()$g, t=1) { 
  g(1,t)
}
test()
[1] 8.560335e-37

참고 URL : https://stackoverflow.com/questions/4357101/promise-already-under-evaluation-recursive-default-argument-reference-or-earlie

반응형