如何将“应用”与 returns 错误维度的函数一起使用 (R)

How to use ‘apply’ with function that returns wrong dimensions (R)

我有一个与各种脚本一起使用的通用函数,returns 一个维度大于一的向量。但是,我想将此函数与“apply”一起使用,并仅使用返回向量中的一个结果。有没有办法不用重写被调用的函数就可以做到这一点??

这是一个玩具示例。我定义函数“dummy”,它接受一个向量和 returns 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,这是废话。有没有办法将 dummy 作为匿名函数传递,以便我只对 z 的每一列使用返回向量的第二个元素?

或许你可以从下面的例子中得到一些启发。
匿名函数使用硬编码函数 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 接受,你就可以传递任何你想要的东西。