문제

반환하는 S4 메소드를 정의하고 싶습니다. 스칼라 리턴 값. 여기서 나는 스칼라 값, 벡터와의 반대를 의미합니다.

setGeneric("getScalar", function(value,  ...) 
  standardGeneric("getScalar")
)
setMethod("getScalar", 
          signature(value = "ANY"),
          def = function(value, ...) getScalar(value,...), ## call external function
          valueClass = "atomic" ### atomic is false, what should I do ?
)

출력으로 메소드를 무시할 수는 없습니다. 숫자, 정수, 문자, 다른 반환 valueclass와 동일한 서명을 갖는 많은 기능을 정의 할 수는 없습니다. 어떻게해야합니까?

편집하다 더 많은 맥락을 제공하려면 :

나는 여기서 원자가 혼란 스럽다고 생각합니다. 나는 스칼라가 숫자 값 또는 부울 또는 캐릭터를 길이를 의미합니다. 더 많은 컨텍스트를 제공하려면 패키지에 3 가지 기능이 있습니다.

dbGetQuery   :return a list/data.frame : i.e some table rows
dbGetScalar  :return a scalar value  : i.e count(*),table_name,..
dbGetNoQuery :return nothing          : update/insert actions

DBI 인터페이스로의 확장입니다.

edit2

스칼라는 길이 1의 벡터라고 가정 할 수 있지만 S4를 사용 하여이 조건을 표현할 수는 없습니다. C# 또는 C에서는 글을 쓸 것입니다

double[]       // vector
double        // scalar

어쩌면 내 기능의 이름을 변경해야 할 수도 있습니다.

도움이 되었습니까?

해결책

한 가지 가능성은 메소드 디스패치 후 리턴 유형의 값을 확인하는 것입니다.

setGeneric("getScalar", function(x, ...) {
    value <- standardGeneric("getScalar")
    if (!is.atomic(value) || length(value) != 1L)
        stop("not a scalar atomic vector")
    value
})

setMethod(getScalar, "ANY", function(x, ...) x)

또 다른 가능성은 제약 조건을 시행하는 기본 클래스에 대한 유효성 검사와 함께 '스칼라'클래스를 정의하는 것입니다.

.Scalar <- setClass("Scalar", contains="ANY", validity=function(object) {
    if (length(object) != 1L)
        "non-scalar object"
    else TRUE
}, prototype=NA)

또는 가상 클래스를 기반으로 작은 계층 구조로 스칼라 유형을 더 강력하게 제어

setClass("Scalar", validity=function(object) {
    if (length(object) != 1L)
        "non-scalar object"
    else TRUE
})

.ScalarInteger <- setClass("ScalarInteger",
    contains=c("Scalar", "integer"),
    prototype=prototype(NA_integer_))

이것은 접근 방식입니다 생체도'에스 바이오베이스 패키지, a mkScalar 건설자.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top