codememo

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

tipmemo 2023. 7. 13. 00:35
반응형

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

여기 제 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 »
테스트 오류():
이미 평가 중인 약속: 재귀적 기본 인수 참조 또는 이전 문제?

의 정의를 대신하면,f의 경우에는g그러면 오류가 사라집니다.

무슨 오류가 있었나요?의 정의를 대체하지 않을 경우 수정하는 방법f의 경우에는g감사합니다!


업데이트:

감사합니다! 두 가지 질문이 있습니다.

if 기능을test에 대한 주장을 더욱 채택합니다.f다음과 같은 것을 추가하시겠습니까?test <- function(g.=g, T=1, f..=f){ g.(1,T, f.=f..) }재귀가 더 많은 경우 추가하는 것이 좋고 안전한 방법입니까?

만일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

인수 평가 컨텍스트를 지정하면 다음과 같은 이름의 문제를 피할 수 있습니다.

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

이미 언급했듯이, 문제는 그 자체로 정의된 함수 인수를 갖는 데서 발생합니다.하지만, 저는 왜 이것이 문제가 되는지에 대한 설명을 덧붙이고 싶습니다. 왜냐하면 이해가 저를 문제를 피하기 위한 더 쉬운 방법으로 이끌었기 때문입니다. 정의 대신에 논의를 통화에 명시하기만 하면 됩니다.

이것은 작동하지 않습니다.

x = 4
my.function <- function(x = x){} 
my.function() # recursive error!

하지만 이것은 효과가 있습니다.

x = 4
my.function <- function(x){} 
my.function(x = x) # works fine!

함수 인수는 자체 로컬 환경에 존재합니다.

R은 로컬 환경에서 먼저 변수를 찾은 다음 글로벌 환경에서 변수를 찾습니다.이는 함수 내부에서 변수가 전역 환경의 변수와 동일한 이름을 가질 수 있고 R이 로컬 정의를 사용하는 것과 같습니다.

함수 인수 정의가 자체 로컬 환경을 형성하는 것은 다음과 같은 다른 인수 값을 기반으로 기본 인수 값을 가질 수 있는 이유입니다.

my.function <- function(x, two.x = 2 * x){}

따라서 함수를 다음과 같이 정의할 수 없는 이유는 다음과 같습니다.my.function <- function(x = x){}그러나 다음을 사용하여 함수를 호출할 수 있습니다.my.function(x = x)함수를 정의할 때 R은 인수를 찾기 때문에 혼동됩니다.x = 서가로의 지역적 로서.x은 하만당신이이 R찾는함호때출할를수를 찾습니다.x = 4사용자가 호출하는 로컬 환경에서.

따라서 인수 이름을 변경하거나 다른 답변에서 언급한 대로 환경을 명시적으로 지정하여 오류를 수정하는 것 외에도 다음과 같이 지정할 수 있습니다.x=x함수를 정의할 때가 아니라 함수를 호출할 때입니다.나의경우, 을명는것하시것그로 합니다.x=x추가 구문을 포함하거나 변수 이름을 점점 더 많이 축적하지 않기 때문에 통화에서 가장 좋은 해결책이었습니다.

저는 G. 그로텐딕 답변을 좋아하지만, 당신의 경우 다음과 같은 함수의 매개 변수에 함수 이름을 포함하지 않는 것이 더 간단한지 궁금합니다.

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) {
  exp(-f(x)/T) 
}
test<- function(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

반응형