It’s perhaps a little unfair to say that data.table is opinionated. If it were, though, its main point of view is that the potential pitfalls of call by reference are sometimes a more than fair price to pay for unparalleled speed and memory-efficiency. It could probably also be said that data.table also prefers conciseness and prefers to (sometimes drastically) modify the semantics of a function by the use of arguments, instead of creating other functions.
There is, however, a new approach to non-base-R data manipulation on the scene. This package also puts efficiency at a premium, but not at the expense of code safety, readability, consistency, and interpretability. (This, by the way, is not to say, that data.table is unreadable, uninterpretable, or inconsistent; it’s just that this other package very explicitly states that...