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

4
在一个by()函数中,我将使用相关性(correlation)作为FUN参数。然而,我也想设置use="complete.obs"
但是我不知道如何在FUN = cor部分传递这个参数。
例如:
by(data, INDICES=list(data$Age), FUN=cor)
4个回答

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

将会起作用。

by 参数将传递给 FUN


7
如果您开始查看各种R帮助文件,例如by函数,您可能会开始注意到一个奇怪的“参数”一次又一次地出现:...。您将看到省略号与函数的所有其他参数一起列出。
实际上,这是一个参数本身。它会收集您传递的任何其他参数,并将它们交给稍后调用的后续函数。文档通常会告诉您这些参数将被传递到哪个函数中。
在这种情况下,在?by中我们看到这个:
...  further arguments to FUN.

这意味着您传递给by的任何其他参数,如果没有列出相应参数名称,则会传递到您传递给FUN的函数中。
另一个常见的例子是在plot中,文档仅列出了两个特定的参数xy。然后有一个...,它可以收集您传递给plot的任何其他内容,并将其传递给方法或par以设置图形参数设置。
因此,在@kohske的示例中,use = "complete.obs"将自动传递给cor,因为它与by的任何其他参数不匹配。

2
@kohske和@joran给出了等效的答案,展示了by内置功能 (这也存在于apply和整个plyr家族中),用于传递额外的参数到提供的函数中,因为这是一个常见的应用/问题。@Tomas还展示了另一种指定匿名函数的方式,即调用“真正”的函数并固定某些参数。在函数式编程中,将参数固定到函数调用中(以有效地使带有较少参数的函数)是一种常见的方法; 在这种情况下,它被称为柯里化部分应用
library("functional")
by(data, INDICES=list(data$Age), FUN=Curry(cor, use = "complete.obs"))

当一个函数不使用...来“传递”参数时,可以使用这种方法,并且您想要指示匿名函数所需的唯一原因是指定某些参数。


有趣...基本上是我在帖子中提到的第二种可能的另一种写法。或者它有什么显著的优势吗? - Tomas
@TomasT。优点在于语法和美学。使用Curry表示您正在指定参数。使用完全的匿名函数,可以做更多事情,但需要更多检查才能看到实际执行的操作。此外,使用匿名函数时(可能)需要指定所有其他参数,即使出于任何其他原因也要传递它们(尽管可以使用...来完成)。 - Brian Diggs

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) })

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接