如何指定by()或相关的apply()函数中使用的FUN

时间:2011-10-13 15:50:10

标签: r callback statistics

by()函数中,我将使用cor(相关)作为FUN。不过,我也想设置use="complete.obs"

我不知道如何在FUN = cor部分传递这个论点。

例如,

by(data, INDICES=list(data$Age), FUN=cor)

4 个答案:

答案 0 :(得分:7)

可能

by(data, INDICES=list(data$Age), FUN=cor, use = "complete.obs")

会奏效。

by的参数传递给FUN

答案 1 :(得分:7)

如果您开始查看各种R帮助文件以查找by等函数,您可能会开始注意到一个好奇的“论点”一遍又一遍地弹出:...。您将看到列出的省略号以及函数的所有其他参数。

这实际上是一个论证本身。它将收集您传递的任何其他参数,并将其移交给稍后调用的后续函数。文档通常会告诉您这些参数将被传递给哪些函数。

在这种情况下,我们在?by中看到了这一点:

...  further arguments to FUN.

这意味着您传递给by的任何与其匹配的其他参数将被传递给您传递给FUN的函数。

另一个常见实例可以在plot中找到,其中文档仅列出两个特定参数xy。然后是...,它会将您传递给plot的任何其他内容收集到方法或par以设置图形参数设置。

所以在@ kohske的例子中,use = "complete.obs"将自动在cor上传递,因为它与by的任何其他参数都不匹配。

答案 2 :(得分:2)

@kohske和@joran给出了相应的答案,显示了by的内置功能(它们也存在于apply和整个plyr系列中),用于将附加参数传递给提供的函数因为这是一个常见的应用/问题。 @Tomas还展示了另一种指定匿名函数的方法,该函数只是一个函数,在固定某些参数的情况下调用“真实”函数。将参数固定到函数调用(以有效地使用较少的参数创建函数)是一种常见的方法,尤其是在编程的函数方法中;在该上下文中,它被称为curryingpartial application

library("functional")
by(data, INDICES=list(data$Age), FUN=Curry(cor, use = "complete.obs"))

当一个函数不使用...“传递”参数时,可以使用此方法,并且您希望指出需要匿名函数的唯一原因是指定某些参数。

答案 3 :(得分:1)

一般来说,您有两种可能性:

1)在调用函数中指定参数(在这种情况下为tapply()by())。即使fun()的关键参数不是第一个:

,这也有效
fun <- function(arg1, arg2, arg3) { ... } # just to see how fun() looks like
tapply(var1, var2, fun, arg1 = something, arg3 = something2) 
    # arg2 will be filled by tapply

2)你可以编写你的包装函数(有时这是必需的):

tapply(var1, var2, function (x) { fun(something, x, something2) })