求解多项式::多项式时R中的setdiff问题

求解多项式::多项式时R中的setdiff问题,r,R,有人能解释一下为什么在下面的例子中R中的setdiff函数失败吗?请注意,使用base R或dplyr并不重要 #setdiff doesn't work poly1 <- polynom::polynomial(c(-2,1)) poly2 <- polynom::polynomial(c(-4,0,1)) solve_poly1 <- solve(poly1) solve_poly2 <- solve(poly2) print(solve_poly2) print(s

有人能解释一下为什么在下面的例子中R中的setdiff函数失败吗?请注意,使用base R或dplyr并不重要

#setdiff doesn't work
poly1 <- polynom::polynomial(c(-2,1))
poly2 <- polynom::polynomial(c(-4,0,1))
solve_poly1 <- solve(poly1)
solve_poly2 <- solve(poly2)
print(solve_poly2)
print(solve_poly1)
setdiff(solve_poly2, solve_poly1)
dplyr::setdiff(solve_poly2, solve_poly1)

#what is the structure?
str(solve_poly1)
str(solve_poly2)

#setdiff works
set1 <- c(2)
set2 <- c(-2,2)
setdiff(set2, set1)
dplyr::setdiff(set2, set1)

#what is the structure?
str(set1)
str(set2)
#setdiff不起作用

poly1这不是setdiff的错误,而是一个错误。因为多项式是通过数值求解的,
solve_poly2
的值不完全是-2和2

> solve_poly1 - set1
[1] 0
> solve_poly2 - set2
[1] -4.440892e-16 -4.440892e-16
为了避免这个问题,您可以定义一个函数,在我修改的公差范围内执行
setdiff
操作


setdiff_公差完全有意义。非常感谢!
> solve_poly1 - set1
[1] 0
> solve_poly2 - set2
[1] -4.440892e-16 -4.440892e-16
setdiff_tolerance <- function(a, b, tol = 1e-7) {
  a[sapply(a, function(x) !any(abs(x - b) <= tol))]
}

setdiff_tolerance(solve_poly2, solve_poly1)
[1] -2