이미 평가 중인 약속: 재귀적 기본 인수 참조 또는 이전 문제?
여기 제 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
'codememo' 카테고리의 다른 글
| 쉼표로 숫자를 수천 개의 구분자로 형식을 지정하는 방법은 무엇입니까? (0) | 2023.07.13 |
|---|---|
| 단일 워크북에서 여러 CSV를 여러 워크시트로 가져오기 (0) | 2023.07.13 |
| 내장된 ASP.NET Core DI Container보다 타사 DI Container를 사용하는 이유는 무엇입니까? (0) | 2023.07.13 |
| 행별 R 데이터 프레임 생성 (0) | 2023.07.13 |
| Vuex에서 데이터를 업데이트하는 중 감시자에서 무한 루프 가져오기 (0) | 2023.07.13 |