R语言如何对列表内所有向量两两应用自定义比较函数
报错原因
你之前调用lapply(L, foo)报错的核心原因是foo函数要求传入x、y两个参数,但lapply遍历列表时每次只会给目标函数传入一个列表元素,自然会触发「y参数缺失」的报错。
正确实现方法
你可以用R内置的combn函数生成所有不重复的两两索引组合,再对每组索引对应的列表元素调用foo函数,无需额外安装第三方包,代码如下:
# 初始化列表和自定义计算函数 L = list(c(1:5), c(-1:-5), c(3:7), c(-4:-8), c(5:9)) foo = function(x, y) t(x) %*% abs(y) # 批量计算所有不重复两两组合的foo值 result <- combn( x = length(L), m = 2, FUN = function(idx_pair) { foo(L[[idx_pair[1]]], L[[idx_pair[2]]]) } )
返回的result是长度为n*(n-1)/2的向量(n为列表元素个数),结果顺序和你要求的组合顺序完全对应:第一个值是第1个和第2个元素的计算结果,第二个是第1个和第3个,最后一个是第n-1个和第n个的计算结果。
可选:返回带索引标识的结果
如果需要明确每个计算结果对应的元素索引,可调整代码如下:
result_with_index <- combn( x = length(L), m = 2, FUN = function(idx_pair) { list( element1_idx = idx_pair[1], element2_idx = idx_pair[2], calculate_value = foo(L[[idx_pair[1]]], L[[idx_pair[2]]]) ) }, simplify = FALSE )
性能说明
你提到实际场景有1000个列表元素,对应的总计算量是499500次,combn的执行效率完全可以满足需求,不需要额外做性能优化。
内容的提问来源于stack exchange,提问作者BMT
相关产品推荐
相关产品推荐

