Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.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
Oop 我可以(应该)继承R中函数的某些部分吗?_Oop_R - Fatal编程技术网

Oop 我可以(应该)继承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

我有两个类似的函数。因此,我想知道现在是否是深入研究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(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)中)不等于
    grep(pattern,cn,value=TRUE)
    ?@Marek,但它是。我想我使用它是因为反转更容易:子集(cn,!cn%in%grep(pattern,cn,value=TRUE))。为关于
    list2env
    的提示干杯。非常有意思。谢谢你的好名单。。我会试着找出哪一个最适合我。更一般地说,有一种解决方案是您喜欢的还是您不建议的?编写函数(第一种和第三种方法)完全与函数编程相结合。所以你得到了R的全力支持。特别是,这意味着参数匹配、参数完成、自定义帮助文件、本地环境、词法作用域—您在R中使用函数时所使用的一切。表达式只是空白代码(没有参数),很难管理,因为R不支持这种类型的编程。相反,表达式更快(没有参数匹配,没有本地环境,没有函数调用);我会将它们用于模拟。如果是关于我,首先,我会尝试简化代码,这样就不需要多重赋值(即调用一个func返回一个对象,调用该对象上的另一个func等)。第二,如果这不容易实现,我会做多重赋值。最后,对于速度和环境中对象的操作,我将使用表达式。
     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())
              ...
              }