如何在R中反转Lappy的函数参数?
我一直在想:在R中,什么是推荐的方法来反转顺序相关函数的函数参数,以允许对项目列表应用样式处理 举个简单的例子,假设我有一个数字列表和一个除数如何在R中反转Lappy的函数参数?,r,parameters,lapply,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 但在现实世界中,列表可能包含更复杂的数据结构,因此无法进
numerator = list(5, 10, 15, 250)
denominator = 2
我想把每个数除以除数。我知道在这种情况下我可以很容易地使用数字向量:
as.numeric(numerator)/denominator
# [1] 2.5 5.0 7.5 125.0
但在现实世界中,列表可能包含更复杂的数据结构,因此无法进行向量转换。这只是一个简单的例子。相反,我们可以像这样使用Lappy(或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
但这已经过时了。有更简单的方法吗?您可以使用
mapply
。它可以从向量
和列表
中获取相应的元素,并对/
进行除法。在这种情况下,“分母”只有一个元素,因此它将被回收。如果“分子”和“分母”中的元素长度相同,则如上所述使用相应的元素
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