I tend to use the nloptr package for optimization problems rather than ROI, but the concepts are the same. Bounds are absolute limits on the range of values, while constraints are limits on *relationships* between values. For instance, if I am minimizing Z, which is a function of X and Y, bounds could be -10 < X < 10, or 3 < Y < 6. Constraints can be more complex. I could impose an *inequality* constraint of Y < 10 - X, which would tell the solver to find the lowest value of Z that falls below that diagonal line on the X-Y plane. An *equality* constraint, Y = 10 - X, would try to find the point ON that line with the lowest value of Z.
In theory, bounds are just simple versions of constraints, but they're usually handled separately by the solvers called by optim(), ROI, nloptr, optimx, etc, and thus are entered as separate arguments into the optimization function. Different solvers can typically handle different levels of complexity in constraints, such as only linear constraints (like the example above), or quadratic constraints.
- Noam