Wrappers vs plain packages as buildInputs

Something that confuses me is the difference between these two, used as buildInputs for a mkShell derivation:

(python3.withPackages (python-pkgs: [ python-pkgs.pandas ]))

versus

python3Packages.pandas.

As far as I understand, the former builds a Python with pandas bundled, whereas the later drops pandas in the site-packages directory? The former version is therefore preferable?

Furthermore, the equivalent R constructs have slightly different semantics:

(rWrapper.override { packages = with rPackages; [ ggplot2 ]; })

versus

rPackages.ggplot2.

In case of R, the R binary is only present in the resulting shell when using the rWrapper, or when explicitly providing it, in addition to all packages. In case of Python, just specifying pandas makes the python binary always available once a package is provided.

To make things a bit more confusing, there is a third case, Hunspell. In case of this package, providing dictionaries as inputs does not work, i.e. [ hunspell hunspellDicts.en-us ] won’t work, only hunspellWithDicts [ hunspellDicts.en-us ] will.

Are these intuitions correct?