如何在r中修改依赖函数?

时间:2014-05-07 17:10:04

标签: r function dependencies

我正在使用函数clhs,它调用函数cor。我想更改clhs用于cor的默认设置。

clhs具有cor

的以下默认设置
cor(data_continuous, use = "complete.obs")

我想在使用cor to (data.continuous, use="all.obs")时更改clhs

有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

所以我猜你是专门研究clhs.data.frame包中的clhs函数。从技术上讲,您可以更改功能的内部。以下是如何进行所请求的更改。只是为了确保修改正确的行,请查看

body(clhs.data.frame)[[10]]

至少对我来说,那回复了cor()。你可以用

改变它
body(clhs.data.frame)[[10]] <- quote(cor_mat <- cor(data.continuous, use="all.obs"))

然后您应该能够像以前一样使用该功能。但要预先警告,改变函数内部的行为方式可能会对依赖某种行为的其他函数造成很大的问题。

更好的想法是创建一个具有不同名称的函数副本,您可以在需要时明确调用它,因此它不会干扰其他任何内容。

为了说明这是如何工作的,我将创建一个简单的例子(因为clhs.data.frame函数非常大). Let's say the ff`函数是由其他人定义的,我们需要在它上面使用它我们的数据

ff<-function(x) {
    y <- x+2
    y <- head(y,-1)
    z <- sum(y)
    return( z/2 )
}


ff(c(1,2,3,4,5))     #9
ff(c(1,NA,3,4,5))    #NA

哦不。在向量中传递NA会导致出现问题。如果只有他们在na.rm=T中指定了sum,那么它就会起作用。那么为什么不改变呢?

body(ff)[[4]]<-quote(z<-sum(y, na.rm=T))
ff(c(1,NA,3,4,5))    #7

请注意,当您致电body(ff)时,您实际上会看到该功能的正文。这实际上是一个可以操作的列表。每个索引对应一个命令或代码块,body(ff)[[4]]是具有sum调用的代码行。所以我们只想换掉我们自己版本的那一行(小心逃避我们的表达,以免它立即被评估)。现在,当我们再次运行该功能时,我们得到了#34;改进了#34;行为。

我只是想让你知道有可能改变这样的功能(这让R很酷)但它也可能会产生很多副作用,所以你不会这样做更安全。