如何在返回错误尺寸(R)的函数中使用“应用”

时间:2018-08-26 15:54:51

标签: r anonymous-function

我有一个通用函数,可与各种脚本一起使用,这些函数返回一个大于一的维向量。但是,我想将此功能与“应用”一起使用,并且仅在返回的向量中使用其中一个结果。有没有一种方法可以不重写被调用的函数?

这是一个玩具示例。我定义了函数“ 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的每一列?

1 个答案:

答案 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个强制性参数XMARGINFUN,以及dots参数。在点参数中,只要FUN接受即可,您可以传递任何内容。