클래스 생성자에게 클래스 자체에 다른 이름을 부여했을 때 (이를 수행하는 합법적 인 이유가 있음) 문제가 발생하기 시작했습니다.
myClassGen <- setRefClass("myClass",
methods = list(foo = function() baz())
)
myClassGen$methods(baz = function() "baz")
myObj <- myClassGen()
myObj$foo()
결과 :
Error in myObj$foo() : could not find function "baz"
그러나 방법은 baz
명확하게 존재합니다.
> myObj$baz
Class method definition for method baz()
function ()
"baz"
<environment: 0x000000002c60f0b8>
생성기 이름을으로 변경하면 위의 오류가 발생하지 않습니다 myClass
.
이 동작이 의도적으로 설계된 것이라면 그 이유는 무엇입니까? 이것이 버그 인 경우 어떻게이 문제를 해결할 수 있습니까? 다른 이름을 가진 생성기와 클래스로 인한 또 다른 숨겨진 문제가 있습니까?
baz()
클래스 인스턴스에서 호출 해야하는 것을 지정해야합니다 .self
.
myClassGen <- setRefClass("myClass",methods = list(foo = function() .self$baz()))
myClassGen$methods(baz = function() "baz")
myObj <- myClassGen()
myObj$foo()
# [1] "baz"
따라서 문제는 다음 코드가 작동하지 않기 때문에 클래스 생성기의 이름이 클래스 이름과 다른 것과 관련이 없습니다 .self
.
myClass <- setRefClass("myClass", methods = list(foo = function() baz()))
myClass$methods(baz = function() "baz")
myObj <- myClass()
myObj$foo()
# Error in myObj$foo() : could not find function "baz"
참조 클래스에 대한 공식 문서는 여기에 있습니다 .
편집 (댓글에 따라) :
$methods(...)
기능 상태 에 관한 섹션의 문서 :
새 메소드는 이름으로 현재 정의 된 모든 메소드를 참조 할 수 있습니다 ($ methods ()에 대한이 호출에서 제공되는 다른 메소드 포함). 이전에 정의 된 메소드는 재분석되지 않는다는 것은 새 메소드를 호출하지 않음을 의미합니다 (재정의하지 않는 한). 동일한 이름의 기존 방법).
올바르게 이해했다면 baz
이전에 정의 된 메서드로 새로 추가 된 메서드 를 호출 할 수 없음을 의미합니다 foo
. 그렇다면 왜 .self$foo()
잘 작동합니까?
확실하지는 않지만 위의 텍스트에 언급 된 방법 의 분석 과 관련이 있다고 생각합니다 .
아마도 통해 정의 된 메서드 setRefClass
가 구문 분석되고 다른 클래스 메서드에 대한 호출이 발견되면 해당 호출이 해당 클래스 메서드에 명시 적으로 연결되어 동일한 이름을 가진 기존 함수와 혼동을 피할 수 있습니다 (과도하게 단순화하여 이러한 호출이 접두사에 .self$
) 가 붙습니다 .
대신에 대한 메서드 호출 .self$something()
은 이미 명시 적이므로 수정되지 않습니다.
이것은 다음 테스트에서 합리적으로 뒷받침되는 것 같습니다. 예를 들어 다음 코드를 실행하면 :
myClassGen <- setRefClass("myClass", methods = list(foo = function() baz(),
baz = function() "baz"))
myObj <- myClassGen()
myObj$foo
우리는 얻는다 :
Class method definition for method foo()
function ()
baz()
<environment: 0x000000000e490938>
Methods used:
"baz"
클래스 메서드 baz
가 메서드 에서 사용 된다는 마지막 줄을 볼 수 있습니다 foo
.
대신 이것을 실행하면 :
myClassGen <- setRefClass("myClass",methods = list(foo = function() .self$baz(),
baz = function() "baz"))
myObj <- myClassGen()
myObj$foo
우리는 얻는다 :
Class method definition for method foo()
function ()
.self$baz()
<environment: 0x00000000107ab5c8>
클래스 메소드에 대한 언급이 없습니다 baz
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다