我有一个通用函数,可与各种脚本一起使用,这些函数返回一个大于一的维向量。但是,我想将此功能与“应用”一起使用,并且仅在返回的向量中使用其中一个结果。有没有一种方法可以不重写被调用的函数?
这是一个玩具示例。我定义了函数“ dummy”,该函数接受一个矢量并以2个矢量返回最小值和最大值。我想称其为使用“应用”逐列在矩阵上进行操作,但我只对最小答案感兴趣(在下面的示例中为“ b”)。有办法吗?
dummy <- function(x)
{
a <- max(x)
b <- min(x)
return(c(a,b))
}
z <- matrix(c(2,3,4,5,6,7,8,9,10), nrow = 3)
apply(z, 2, dummy)
这给出了5,5的答案,这是胡扯。有没有一种方法可以将哑元作为匿名函数传递,以便我仅将返回向量的第二个元素用于z的每一列?
答案 0 :(得分:1)
也许您可以从以下示例中得到一些启发。
匿名函数使用硬编码函数dummy
和另一个函数,参数fun
设置为等于log
。
dummy <- function(x){
a <- max(x)
b <- min(x)
c(a, b)
}
z <- matrix(c(2,3,4,5,6,7,8,9,10), nrow = 3)
apply(z, 2, dummy)
apply(z, 2, function(x, fun){
y <- dummy(x)
y <- fun(y[2])
y
}, fun = log)
#[1] 0.6931472 1.6094379 2.0794415
另一种可能性是让itworks
需要两个参数,向量x
和根据情况选择的函数。
itworks <- function(x, fun){
qq <- quantile(x)
fun(qq[2])
}
apply(z, 2, itworks, fun = sin)
#[1] 0.5984721 -0.7055403 0.7984871
这里的要点是,函数接受的参数可以是任何东西,包括其他函数。 apply
具有3个强制性参数X
,MARGIN
和FUN
,以及dots
参数。在点参数中,只要FUN
接受即可,您可以传递任何内容。