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

3

我一直在想:在R中,对于那些参数顺序有依赖的函数,推荐使用什么方法来反转函数参数,以实现对一个列表进行apply-style处理?

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

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个回答

3

您可以使用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

3
另一种方法是:
sapply(numerator, function(x) denominator / x)
## [1] 0.4000000 0.2000000 0.1333333 0.0080000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接