S4:使用类属性作为类方法的默认输入值

时间:2018-03-26 17:39:00

标签: r oop s4

我是R的S4 OO系统的新手。我正在考虑使用类属性作为泛型方法的默认输入,但我收到一条错误消息,指出argument "xxx" is missing, with no default

基本上我有一个函数列表(即类方法),它们在同一组类属性中运行。我希望使用这些类属性作为函数列表的默认输入值,但我实现的方式(我使用definition = function(theObject, input = theObject@attribute1),请参阅下面的示例代码)抛出错误...为什么它不起作用?

非常感谢提前!

class1 = setClass("class1", 
                  slots = c(attribute1 = "numeric"), 
                  prototype = list(
                    attribute1 = NULL
                  ))

setGeneric(name = "method1", 
           def = function(theObject, input){
             standardGeneric("method1")
           })

setMethod(f = "method1", 
          signature = "class1", 
          definition = function(theObject, input = theObject@attribute1){
            theObject@attribute1 = input + 1
            return (theObject)
          })


x = class1() # instantiate an object from class1
x@attribute1 = 1 # set attribute value
method1(x, input = 2) # This works fine if I use "input = 2" explicitly

# This throws the following error "Error in method1(x) : argument "input" is missing, with no default"
# Even though in setMethod part I did specify the default value of input
method1(x)

1 个答案:

答案 0 :(得分:4)

不确定为什么会出现这种情况,但为了设置setMethod输入的默认值,泛型也需要默认值。 e.g:

class1 = setClass("class1", 
                  slots = c(attribute1 = "numeric"), 
                  prototype = list(
                    attribute1 = NULL
                  ))

setGeneric(name = "method1", 
           def = function(theObject, input=NA){ #Setting any input here enables defaults for methods
             standardGeneric("method1")
           })

setMethod(f = "method1", 
          signature = "class1", 
          definition = function(theObject, input=1){
            theObject@attribute1 = input + 1
            return (theObject)
          })

x = class1() 
x@attribute1 = 1 
method1(x, input = 2) 
method1(x)