在by()
函数中,我将使用cor
(相关)作为FUN
。不过,我也想设置use="complete.obs"
。
我不知道如何在FUN = cor
部分传递这个论点。
例如,
by(data, INDICES=list(data$Age), FUN=cor)
答案 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
中找到,其中文档仅列出两个特定参数x
和y
。然后是...
,它会将您传递给plot
的任何其他内容收集到方法或par
以设置图形参数设置。
所以在@ kohske的例子中,use = "complete.obs"
将自动在cor
上传递,因为它与by
的任何其他参数都不匹配。
答案 2 :(得分:2)
@kohske和@joran给出了相应的答案,显示了by
的内置功能(它们也存在于apply
和整个plyr
系列中),用于将附加参数传递给提供的函数因为这是一个常见的应用/问题。 @Tomas还展示了另一种指定匿名函数的方法,该函数只是一个函数,在固定某些参数的情况下调用“真实”函数。将参数固定到函数调用(以有效地使用较少的参数创建函数)是一种常见的方法,尤其是在编程的函数方法中;在该上下文中,它被称为currying或partial 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) })