R中写入(通用)函数的参数和类

时间:2011-12-08 11:20:30

标签: r function generics methods

我想用几个非常简单的函数制作一个小R包。我使用的文献是“创建R包:教程”和“编写R扩展”。虽然我尝试过,但我并不真正理解泛型函数和方法的概念以及如何处理不同函数中的参数。

这是我的代码如何显示的一个小例子:

#Make generic function
f <- function(x,...) UseMethod("newmethod")

#Default method
f.default <- function(a,b=5,c=3,...){
    out <- a+b+c
    class(out) <- "fclass"
}

# Print method
print.f <- function(x,...){
    cat("Result:")
    print(x)
}

# Summary method
summary.f <- function(object,...){
    res <- object
    class(res) <- "fsummary"
    print(res)
}

# Plot method
plot.f <-function(x,p=0.3,...){}

我有一个名为f的函数,默认为f.default。实际上我的函数需要几个参数(非它们被定义为x),那么我如何制作我的泛型函数呢? print方法应该只打印f.default的输出(在这个简单的情况下类似于摘要输出)。 plot.f方法使用f.default的输出和一个附加参数(强制性)。如何正确编写这些功能?通常的方法使用像“对象”和“x”这样的参数......但正如我所说,我的函数中不需要任何变量x ......我有点困惑......也许有人可以提供帮助。

如果有人在那里如何愿意帮助我解决这个问题,我也可以发送“真正的”R代码(不仅仅是这个虚构的例子)。

2 个答案:

答案 0 :(得分:5)

你在这里弄得一团糟......

首先,构造函数可能不应该是泛型/方法。类似的东西:

makefclass = function(a,b,c){
        l = list(a=a,b=b,c=c)
        class(l)="fclass"
        return(l)
      }

然后你可以写print.fclass:

print.fclass=function(x,...){
     cat("I'm an fclass!")
     cat("my abc is ",x$a,x$b,x$c,"\n")
}

然后你做:

> f=makefclass(1,2,3)
> f
I'm an fclass!my abc is  1 2 2 

希望有帮助...

答案 1 :(得分:3)

我修复了你的代码并对我修复的内容发表了一些评论......

UPDATE 正如@Spacedman指出的那样,“构造函数”函数应该不是通用的。但我会将它保留在这里,以便您看到如何完成通用功能。

#Make generic function
# This is the "constructor" function...
# ... UseMethod should have the name of the function!
f <- function(x,...) UseMethod("f")

#Default method
# ... The class name should be the same as the constructor
f.default <- function(a,b=5,c=3,...){
    out <- a+b+c
    class(out) <- "f"
    out # must return the object out, not the class name!
}

# Print method
# The "f" part of "print.f" must be the same as the class!
print.f <- function(x,...){
    cat("Result for f: ")
    print(unclass(x)) # Must unclass to avoid infinite recursion
    # NextMethod(x) # Alternative, but prints the class attribute...
}

# Summary method
# Should return a summary object (and not print it!)
# Need a unique class for it ("fsummary")
summary.f <- function(object,...){
    res <- object
    class(res) <- "fsummary"
    res
}

# Now need to print the summary too:
print.fsummary <- function(x, ...) {
    cat("f summary!\n")
    # Nice summary print goes here...
}

# Plot method
plot.f <-function(x,p=0.3,...){ cat("PLOTTING!\n") }

# Try it out:

x <- f(3)
x # print x

y <- summary(x) # 
y # print summary

plot(x)