你如何在 R 中反转 lapply 的函数参数?

How do you invert function parameters for lapply in R?

我一直在想:在 R 中,为依赖于顺序的函数反转函数参数以允许对项目列表进行应用式处理的推荐方法是什么?

举个简单的例子,假设我有一个数字列表和一个除数。

numerator = list(5, 10, 15, 250)
denominator = 2

我想将每个数字除以除数。我知道在这种情况下我可以轻松使用数字向量:

as.numeric(numerator)/denominator
# [1]   2.5   5.0   7.5 125.0

但在现实世界中,列表可能包含更复杂的数据结构,因此无法进行向量转换。这只是一个简单的例子。相反,我们可以像这样使用 lapply(或 sapply)来产生相同的答案:

sapply(numerator, "/", denominator)
# [1]   2.5   5.0   7.5 125.0

那么问题来了:如果你想翻转函数的参数,你会怎么做?比如,将 "denominator" 除以每个数字,而不是反过来?通常对于“/”,您提供分子,然后是分母。但是现在我想用分子除分母,“/”函数不能再与sapply一起使用(它要求列表项是函数的第一个参数)。

我想要这个结果:

denominator/as.numeric(numerator)
# [1] 0.4000000 0.2000000 0.1333333 0.0080000

我通常这样做的方法是编写一个反转参数的新函数:

inverse_divide = function(denominator, numerator) {
    return(numerator/denominator)
}

现在,它起作用了:

sapply(numerator, inverse_divide, denominator)
# [1] 0.4000000 0.2000000 0.1333333 0.0080000

但这已经过时了。有没有更简单的方法?

您可以使用 mapply。它可以从 vectorlist 中取相应的元素并除以 /。在本例中,'denominator'只有一个元素,所以会被回收。如果'numerator'和'denominator'中的元素长度相同,则按上述方法使用对应的元素。

 mapply(`/`, denominator, numerator)
 #[1] 0.4000000 0.2000000 0.1333333 0.0080000

 mapply(`/`, numerator, denominator)
#[1]   2.5   5.0   7.5 125.0

另一种方式是

sapply(numerator, function(x) denominator / x)
## [1] 0.4000000 0.2000000 0.1333333 0.0080000