1
  1. いくつかのポリモーフ コンストラクターと関数を定義する方法

    function Add( x, y : Integer ) : Integer;
    begin
        Add := x + y
    end;
    
    function Add( s, t : String ) : String;
    begin
        Add := Concat( s, t )
    end;
    
    begin
        Writeln(Add(1, 2));
        Writeln(Add('Hello, ', 'World!'));
    end.
    

のような場合の決定によってのみこれを行うことはできますか

A<-setRefClass(Class = "A"
              ,fields = list(var1="character")
              ,methods = list(setFields=A.setFields
                             ,initialize=function(var1) {
                                if(isClass(var1,"B"))
                                   .self$var1<-as.character(var1$getFields("var1"))                                  
                                else{
                                  .self$var1<-as.character(var1)
                                }
                                .self
                              })
)
  1. 関数型プログラミングとオブジェクト指向プログラミングを組み合わせる方法。したがって、関数 getFields(vecB) を呼び出す場合、vecB はオブジェクト B のベクトルまたはリストです。戻り値は各オブジェクトの値である必要がありますか?

     B.getFields<-function(...,values){ 
       vars<-mget(names(.refClassDef@fieldClasses), envir = attr(.self, ".xData"))
       if(missing(values)) 
         return(vars)
       if(length(vars)==1)
         return(vars[[1]])
      return(vars[names(vars) %in% values])
      }
    
         B<-setRefClass(Class = "B"
                   ,fields = list(var1 = "character")
                     )
    
  2. クラスAから初期化する関数などをデバッグする方法は? 私は試した

    A$trace("initialize")
    a<-A$new("ABC")
    initial<-a$initialize
    trace(initial,browser,where=A)
    

    しかし、うまくいきません。

4

2 に答える 2

4
  1. ポリモーフィズムに S4 ​​ジェネリックとメソッドを使用する

    setGeneric("Add", function(x, y) standardGeneric("Add"))
    setMethod(Add, c("numeric", "numeric"), function(x, y) x + y)
    setMethod(Add, c("character", "character"), function(x, y) paste0(x, y))
    

    それで

    > Add(1, 2)
    [1] 3
    > Add("hello ", "world")
    [1] "hello world"
    > Add("hello ", 2)
    Error in (function (classes, fdef, mtable)  : 
      unable to find an inherited method for function 'Add' for signature '"character", "numeric"'
    

    このジェネリックを参照クラスで使用する 1 つのアイデアは、

    A <- setRefClass("A",
        fields=list(x="ANY"),
        methods=list(
          getX=function() {
              .self$x
          }, setX=function(x) {
              .self$x <- x
              .self
          }, addX=function(y) {
              setX(Add(getX(), y))
          }, show=function() {
              cat("class:", class(.self), "\nx:", getX(), "\n")
          }))
    

    関数型プログラム スタイルの適切なディスパッチ:

    setMethod(Add, c("A", "ANY"), function(x, y) x$addX(y))
    setMethod(Add, c("A", "A"), function(x, y) x$addX(y$getX()))
    

    $addX()(おそらく関数型プログラミングでは、 as として実装するA(.self, x=Add(x$getX(), y))、つまり x のクローンを作成する方が理にかなっていますか?)

    > Add(A(x=1), A(x=2))
    class: A 
    x: 3 
    > Add(A(x="hello "), "world")
    class: A 
    x: hello world 
    > A(x=2)$addX(3)
    class: A 
    x: 5 
    

    そうではありませんがA(x=1)$addX(A(x=2))

  2. フィールド値を返す 1 つの方法については、この回答を参照してください。

    B = setRefClass("B", fields=c(var1="list", var2="character"),
        methods=list(getFields=function(values) {
            flds = names(getRefClass()$fields())
            if (!missing(values))
                flds = flds[flds %in% values]
            result = setNames(vector("list", length(flds)), flds)
            for (fld in flds)
                result[[fld]] = .self[[fld]]
            result
        }))
    

    機能的な方法で呼び出す 1 つの方法では、別の実装が必要です。

    setGeneric("getFields", function(x, ...) standardGeneric("getFields"))
    setMethod(getFields, "B", function(x, ...) x$getFields(...))
    setMethod(getFields, "list", function(x, ...) lapply(x, getFields, ...))
    
  3. あなたのクラス A の例は不完全です。

    A <- setRefClass("A", methods=list(initialize=function(...) {
        message("hello A")
        callSuper(...)
    }))
    

    その後

    > A$trace("initialize", browser)
    Tracing reference method "initialize" for class "A"
    [1] "initialize"
    > A()
    Tracing .Object$initialize(...) on entry 
    Called from: eval(expr, envir, enclos)
    Browse[1]> n
    debug: {
        message("hello A")
        callSuper(...)
    }
    Browse[2]> n
    debug: message("hello A")
    Browse[2]> 
    
于 2013-09-11T23:18:04.390 に答える