R对向量列表使用setdiff结合匿名函数出现参数缺失错误如何解决
错误原因
lapply的运行逻辑是遍历输入列表的每一个元素,每次迭代只会将单个元素作为参数传入你定义的匿名函数。你定义的匿名函数要求接收one、two两个入参,但调用lapply时没有给第二个参数two传值,因此触发缺失参数的报错。
解决方案
根据实际使用场景,可选择以下两种实现方式:
场景1:列表中所有向量和同一个固定参照向量求差集
直接在匿名函数中固定第二个参数的取值即可,示例为所有向量和vec_one求差:
lapply(list(vec_one, vec_two), \(x) setdiff(x, vec_one)) # 运行输出: # [[1]] # character(0) # # [[2]] # [1] "also"
如果需要以vec_two为参照,修改匿名函数内的固定参数即可。
场景2:列表内的向量按配对规则求差集
如果需要让列表内的向量按对应位置配对求差,可以使用支持多列表同步遍历的mapply函数:
# 配对规则:vec_one和vec_two求差、vec_two和vec_one求差 mapply(setdiff, list(vec_one, vec_two), list(vec_two, vec_one)) # 运行输出: # [[1]] # character(0) # # [[2]] # [1] "also"
如果列表元素更多,需要计算所有两两组合的双向差集,可以用combn函数实现:
combn(list(vec_one, vec_two), 2, \(pair) list(setdiff(pair[[1]], pair[[2]]), setdiff(pair[[2]], pair[[1]])))
内容的提问来源于stack exchange,提问作者bioinformatics2020
相关产品推荐
相关产品推荐

