Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 设置方法初始化S4类与使用函数_R_S4 - Fatal编程技术网

R 设置方法初始化S4类与使用函数

R 设置方法初始化S4类与使用函数,r,s4,R,S4,我现在通过两种方式进行班级建设: 第一, setMethod("initialize", signature(.Object = "BondCashFlows"), function(.Object, x, y, ...){ do some things .Object@foo = array[,m] } 第二, BondCashFlows <- function(){do

我现在通过两种方式进行班级建设:

第一,

setMethod("initialize", signature(.Object = "BondCashFlows"),
                  function(.Object, x, y, ...){ 
                    do some things .Object@foo = array[,m]
                  } 
第二,

BondCashFlows <- function(){do some things new("BondCashFlows", ...)

BondCashFlows与简单的R函数相比,使用S4方法的优点之一是该方法是强类型的

  • 拥有签名是一种保护,方法不会暴露于类型 这不符合他们的签名要求。否则它会的 抛出异常
  • 通常情况下,您需要区分方法行为 取决于传递的参数类型。强大的打字能力使这一点变得更加重要 非常简单
  • 强类型更容易让人理解(即使在R中可以讨论这个论点,S4语法对于初学者来说也不是很直观)
  • 这里是一个例子,我定义了一个简单的函数,然后将它包装在一个方法中

    show.vector <- function(.object,name,...).object[,name]
    
    ## you should first define a generic to define
    setGeneric("returnVector",  function(.object,name,...)
      standardGeneric("returnVector")
    )
    
    ## the method here is just calling the showvector function. 
    ## Note that the function argument types are explicitly  defined.
    setMethod("returnVector", signature(.object="data.frame", name="character"),
              def = function(.object, name, ...) show.vector(.object,name,...),
              valueClass = "data.frame"
    )
    
    与方法调用相比:

    returnVector(mtcars,'cyl')  ## works
    returnVector(mtcars,1:10)   ## SAFER throw an excpetion
    returnVector(mtcars,-1)     ## SAFER throw an excpetion
    

    因此,如果您要向其他人公开您的方法,最好将它们封装在方法中

    谢谢,这有助于我理解为什么包含BondCashFlows的类不再工作。我没有将函数设置为泛型。我想我也需要这样做。我有一个类,然后我设置了一个泛型函数,然后是方法。呸,这一切让我迷路了。但是,这很有帮助,谢谢
    returnVector(mtcars,'cyl')  ## works
    returnVector(mtcars,1:10)   ## SAFER throw an excpetion
    returnVector(mtcars,-1)     ## SAFER throw an excpetion