Oop 我可以(应该)继承R中函数的某些部分吗?
我有两个类似的函数。因此,我想知道现在是否是深入研究R中继承的正确时机Oop 我可以(应该)继承R中函数的某些部分吗?,oop,r,Oop,R,我有两个类似的函数。因此,我想知道现在是否是深入研究R中继承的正确时机 firstfunc <- function(table,pattern="^Variable") { dframe <- get(table) cn <- colnames(get(table)) qs <- subset(cn, cn %in% grep(pattern, cn, value=TRUE)) ..... } secondfunc <- function(tabl
firstfunc <- function(table,pattern="^Variable") {
dframe <- get(table)
cn <- colnames(get(table))
qs <- subset(cn, cn %in% grep(pattern, cn, value=TRUE))
.....
}
secondfunc <- function(table,pattern="^stat"){
dframe <- get(table)
cn <- colnames(get(table))
qs <- subset(cn, cn %in% grep(pattern, cn, value=TRUE))
....
}
firstfunc可以吗?可以<代码>S4
具有处理此场景的功能。看。Hadley最近也写过(参见“泛型函数和方法”一节)
您可以在任何现有的S4
代码中使用setMethod
看到这一点(参见示例)。请注意同一函数的不同签名
您应该吗?是的,您应该这样做,但这会增加代码的复杂性<代码>S4不是免费提供的;它需要更多的基础设施。所以有一个折衷办法,你需要决定它是否值得。[编辑:啊,我没注意到你只公布了功能的开始,而且主体可能不同] 考虑到所有这些“get”内容和列名的使用,您可能还需要研究lm()和friends使用的公式机制。可以在公式中按名称指定列,例如:
foofunc(~Variable, data=mytable)
并使用模型函数获取值。比如model.matrix等等。我从“get”中猜测,您正在传递对象的名称,这通常是一件不好的事情。传递对象。R中没有函数部分的继承。您不能从其他函数“继承部分”函数,只能从其他函数调用函数。R中的所有OO范例(S3、S4、REF类)都是他们所说的面向对象的。方法根据它们接收的对象类进行调度 您的问题是如何消除代码重复 有两种方法,一种是标准的,另一种不是标准的
- 标准方法:为重复代码编写函数,并从其他函数调用它们。缺点是函数只返回一个对象,但有三个。所以你可以这样做:
repeated_code <- function(table, pattern){ objects <- list() objects$dframe <- get(table) objects$cn <- colnames(get(table)) objects$qs <- subset(cn, cn %in% grep(pattern, cn, value=TRUE)) } firstfunc <- function(table,pattern="^Variable") { objects <- repeated_code(table, pattern) ... manipulate objects ... } secondfunc <- function(table,pattern="^Variable") { objects <- repeated_code(table, pattern) ... manipulate objects ... }
]谢谢谢恩!我一定会查的。我发现了一个非常全面的站点:但不知怎的,它从S4发出了警告(只需使用ctrl+f来查找S4)。你对此有何看法?@ran2理论上,你“应该”在这个案例中使用它。由于额外的开销,我自己从来没有将它与包一起使用过。在您提供的示例中,我个人只创建一个包含多个子函数的函数。在他的情况下,S4将不起作用,R中的方法将根据传递给函数的数据类型进行分派。他有两个数据类型相同的函数。现在该相信什么:)?Dispatch“基于所有参数的类”,因此您可以为您的模式参数设置不同的类,您将得到您想要的。更改某个对象的类很容易:class(object)传递对象名的原因是dbListTables将表名作为字符向量返回。另外,我只是想更仔细地看看R中的OO,并认为这可能是一个这样做的机会。不过,thx是指针!
子集(cn,cn%在%grep(pattern,cn,value=TRUE)中)不等于
?@Marek,但它是。我想我使用它是因为反转更容易:子集(cn,!cn%in%grep(pattern,cn,value=TRUE))。为关于grep(pattern,cn,value=TRUE)
的提示干杯。非常有意思。谢谢你的好名单。。我会试着找出哪一个最适合我。更一般地说,有一种解决方案是您喜欢的还是您不建议的?编写函数(第一种和第三种方法)完全与函数编程相结合。所以你得到了R的全力支持。特别是,这意味着参数匹配、参数完成、自定义帮助文件、本地环境、词法作用域—您在R中使用函数时所使用的一切。表达式只是空白代码(没有参数),很难管理,因为R不支持这种类型的编程。相反,表达式更快(没有参数匹配,没有本地环境,没有函数调用);我会将它们用于模拟。如果是关于我,首先,我会尝试简化代码,这样就不需要多重赋值(即调用一个func返回一个对象,调用该对象上的另一个func等)。第二,如果这不容易实现,我会做多重赋值。最后,对于速度和环境中对象的操作,我将使用表达式。list2env
redundant_code <- expression({ dframe <- get(table) cn <- colnames(get(table)) qs <- subset(cn, cn %in% grep(pattern, cn, value=TRUE)) }) firstfunc <- function(table,pattern="^Variable") { eval(redundant_code, envir=parent.frame()) ... } secondfunc <- function(table,pattern="^Variable") { eval(redundant_code, envir=parent.frame()) ... }
secondfunc <- function(table,pattern="^Variable") { objects <- repeated_code(table, pattern) list2env(objects, envir = parent.frame()) ... }