R语言实现A-star算法时使用sapply遭遇“$运算符对原子向量无效”错误
问题原因分析
你遇到的错误Error during wrapup: $ operator is invalid for atomic vectors,核心问题出在**append函数的使用方式上**,导致frontier的结构和你预期的完全不一样。
让我们拆解下你的代码执行后的实际结构:
- 初始
frontier <- list()是一个空列表。 - 当你执行
frontier <- append(frontier, list(node = starting_node, cost = 0, path = list()))时,append会把第二个参数(一个包含3个命名元素的列表)的每个元素单独添加到frontier中。也就是说,最终frontier是一个长度为3的列表,结构如下:str(frontier) # List of 3 # $ node:List of 2 # ..$ : num 1 # ..$ : num 1 # $ cost: num 0 # $ path: list() - 当你用
sapply(frontier, function(item) item$cost)遍历frontier时,item依次是node(一个列表)、cost(原子向量0)、path(空列表)。其中第二个item是原子向量,用$运算符访问它的cost属性自然会报错——原子向量不支持$操作。
修正方案
你需要把整个节点对象(包含node、cost、path的列表)作为一个单独的元素添加到frontier中,而不是拆成三个元素。只需要在append的第二个参数外层再套一层list()即可:
frontier <- list() starting_node = list(1, 1) # 外层多套一层list(),把节点对象作为单个元素添加 frontier <- append(frontier, list(list(node = starting_node, cost = 0, path = list()))) # 现在可以正常获取cost了 costs = sapply(frontier, function(item) item$cost) print(costs) # [1] 0
此时frontier的结构是长度为1的列表,每个元素是一个完整的节点对象:
str(frontier) # List of 1 # $ :List of 3 # ..$ node :List of 2 # .. ..$ : num 1 # .. ..$ : num 1 # ..$ cost : num 0 # ..$ path : list()
这样sapply遍历的时候,每个item都是包含cost属性的子列表,$cost就能正常访问了。
内容的提问来源于stack exchange,提问作者LegendWK
相关产品推荐
相关产品推荐

