为何优化函数后得到非数值向量?如何解决?
问题原因与解决方案
错误根源
optimize()函数返回的是列表类型,默认包含两个核心元素:
$minimum:你要找的最优解S的数值$objective:对应目标函数的最小平方差值
你直接把整个列表赋值给surv[x],会导致surv这个名义上的numeric向量,实际存储的是列表元素。后续计算时,这些列表元素无法参与数值运算,就会抛出"non-numeric argument to binary operator"错误。
修正方法
赋值时直接提取你需要的数值字段即可:
- 如果要存储最优的S值:
surv[x] <- optimize(dif, c(0, 1), maximum = FALSE, tol = 0.1)$minimum
- 如果要存储目标函数的最小平方差结果:
surv[x] <- optimize(dif, c(0, 1), maximum = FALSE, tol = 0.1)$objective
为什么unlist()/as.numeric()没用?
因为surv的每个元素本身就是一个独立的小列表,unlist()会把所有列表的元素展开成一个更长的向量,而非把每个位置的列表转换成单个数值。直接提取optimize返回结果的对应字段,才能让surv真正存储纯数值。
内容的提问来源于stack exchange,提问作者KevC
相关产品推荐
相关产品推荐

