gpt4 book ai didi

oop - 我可以(应该)继承 R 中函数的一部分吗?

转载 作者:行者123 更新时间:2023-12-03 18:18:21 25 4
gpt4 key购买 nike

我有两个非常相似的函数。因此,我想知道现在是否是深入研究 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))

....

}

将有两个以上的功能和两种模式。我的表包含很多变量,可以很容易地按名称分组,这就是我使用这些模式标识的原因。到目前为止,它运行良好,并且 c&p 这几行代码并不费力。但是,将这些行写入一个函数/方法并让其他人继承是否合理?

到目前为止,我在 R 中阅读的关于 OO 的大多数帮助都使用了将属性分配给数据然后使用通用函数的示例。不幸的是,我还不明白这是否也有助于我的情况。

感谢您提供任何建议,请先从良好的头脑开始!

最佳答案

R 中没有函数部分的继承。您不能从其他函数“继承部分”函数,只能从其他函数调用函数。 R 中的所有 OO 范式(S3、S4、refClasses)正是他们所说的,面向对象。方法根据它们接收的对象类进行调度。

你的问题真的是如何摆脱代码重复 .

有两种方式,一种标准,一种不那么标准。

  • 标准方式:为重复代码编写函数并从其他函数调用它们。缺点是函数只返回一个对象,但你有三个。所以你可以做这样的事情:
    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
    ...
    }
  • 不那么标准的方式:使用未评估的表达式:
     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())
    ...
    }

  • [更新:从 R 2.12.0 开始,还有另一种多分配方式。
    编写一个返回对象列表的函数(如上面的“标准”情况)。然后用 list2env将返回列表中的对象分配给当前的evnvironmnet :
        secondfunc <- function(table,pattern="^Variable") {
    objects <- repeated_code(table, pattern)
    list2env(objects, envir = parent.frame())
    ...
    }

    ]

    关于oop - 我可以(应该)继承 R 中函数的一部分吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4045445/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com