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

时间:2015-04-30 08:16:58

标签: r parameters lapply

我一直想知道:在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

所以这里有一个问题:如果你想将参数翻转到函数,你会怎么做?如同,将每个数字除以“分母”,而不是相反?通常以“/”表示分子,然后是分母。但是现在我想用分子划分分母,“/”函数不能再与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

但这变老了。有更简单的方法吗?

2 个答案:

答案 0 :(得分:3)

您可以使用mapply。它可以从vectorlist中获取相应的元素并除以/。在这种情况下,“分母”只有一个元素,因此它将被回收。如果元素的长度在“分子”和“分子”中都相同和&分母',如上所述使用相应的元素。

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

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

答案 1 :(得分:3)

另一种方式是

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