我一直在想:在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
但这种方式会变得老套。有没有更简单的方法?